Как объединить столбцы MapType в объединении - PullRequest
0 голосов
/ 12 июня 2019

У меня есть два кадра данных с одним и тем же столбцом MapType.При объединении этих фреймов данных мне бы хотелось, чтобы пары ключ: значение dataframe1 и dataframe2 находились в одном столбце, а не в двух отдельных.

Это для Pyspark 2.0.Я собираюсь использовать его на фреймах данных с каждыми ~ 200 миллионами строк, так что сбор или подобные подходы, скорее всего, не будут обсуждаться.

Примеры фреймов данных, над которыми я сейчас работаю, оба имеют схему:

root
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = false)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)

После объединения фреймов данных я получаю такую ​​схему:

root
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = false)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)
 |-- ID: string (nullable = true)
 |-- mapCol: map (nullable = true)
 |    |-- key: string
 |    |-- value: float (valueContainsNull = true)

Цель состоит в том, чтобы остаться с исходной схемой (возможно, дополнительный столбец для dataframe1.ID и dataframe2.ID для размещения отсутствующих строк в одном или другом кадре данных).

1 Ответ

0 голосов
/ 12 июня 2019

После того, как вы сделали ваше объединение, вы можете использовать функцию map_concat (введено в версии 2.4), чтобы объединить две карты в одну карту / столбец

например:

from pyspark.sql.functions import *
df_as1 = df.alias("df_as1")
df_as2 = df.alias("df_as2")
joined_df = df_as1.join(df_as2, col("df_as1.name") == col("df_as2.name"), 'inner')
joined_df.select(map_concat("df_as1.map1", "df_as2.map2").alias("map3")).show(truncate=False)
...