У меня есть два искровых файла dfs, содержащие разное количество столбцов, причем первый столбец является идентификатором (для обоих). Я хочу иметь значения столбцов для каждого идентификатора в виде словаря (визуальный элемент будет лучше понимать, чего я пытаюсь достичь).
что у меня есть:
Результат, который я пытаюсь получить
Что я пробовал, но не смог получить результат: => [row.asDict() для строки в df.collect()], чтобы получить список словарей, но не удалось найти способ добавить каждый из них в качестве значения столбца.
PS: Я понимаю, что мой вопрос может быть о XYProblem, но, поскольку я не знаю всех концепций, доступных в pyspark/python, это лучший способ представить проблему, который я мог придумать.
Предполагая, что каждая таблица имеет только одну строку на ID
, вы можете создать столбец MapType
для каждого поля таблицы, используя create_map, а затем выполнить внутреннее объединение двух таблиц. Вот меньший пример:
table1 = spark.createDataFrame(
[("1", 34, 45), ("2", 78, 89)],
["ID","col1","col2"]
)
table2 = spark.createDataFrame(
[("1", 43, 54), ("2", 11, 12)],
["ID","col1","col2"]
)
table1 = table1.withColumn("table1_cols", F.create_map(
F.lit("col1"), F.col("col1"), F.lit("col2"), F.col("col2")
)
table2 = table2.withColumn("table2_cols", F.create_map(
F.lit("col1"), F.col("col1"), F.lit("col2"), F.col("col2")
)
table1.join(table2, on=["ID"], how='inner').select(
'ID','table1_cols','table2_cols'
)
Вот результирующая таблица и схема:
+---+------------------------+------------------------+
|ID |table1_cols |table2_cols |
+---+------------------------+------------------------+
|1 |{col1 -> 34, col2 -> 45}|{col1 -> 43, col2 -> 54}|
|2 |{col1 -> 78, col2 -> 89}|{col1 -> 11, col2 -> 12}|
+---+------------------------+------------------------+
root
|-- ID: string (nullable = true)
|-- table1_cols: map (nullable = false)
| |-- key: string
| |-- value: long (valueContainsNull = true)
|-- table2_cols: map (nullable = false)
| |-- key: string
| |-- value: long (valueContainsNull = true)