Перед преобразованием столбцов из столбца, имеющего dict в качестве значений, вы должны знать о его ключах. Так можно пометить столбцы. Ниже я создаю sample dataframe
, а затем преобразую ключи в столбец.
df = sqlContext.createDataFrame([
[{'a':1,'b':2, 'c': 3}],
[{'a':1,'b':2, 'c': 3}],
[{'a':1,'b':2, 'c': 3}]], ["col"]
)
df.show(truncate=False)
+---------------------------+
|col |
+---------------------------+
|Map(b -> 2, c -> 3, a -> 1)|
|Map(b -> 2, c -> 3, a -> 1)|
|Map(b -> 2, c -> 3, a -> 1)|
+---------------------------+
После создания примера фрейма данных получим из него первую строку -
first_row = df.first()['col'] #select column which have dict as values
print (first_row)
{u'a': 1, u'b': 2, u'c': 3}
Теперь у нас есть значения из первой строки, а также значения столбца DICT, извлеките из него ключи, чтобы мы могли создать из него столбец -
columns = first_row.keys()
print (columns)
[u'a', u'c', u'b']
После этого цикла по списку столбцов и выберите их как столбец из столбца dict -
from pyspark.sql import functions as F
col_list = [F.col("col").getItem(col).alias(col) for col in columns]
df.select(col_list).show()
+---+---+---+
| a| c| b|
+---+---+---+
| 1| 3| 2|
| 1| 3| 2|
| 1| 3| 2|
+---+---+---+
Есть и другие способы сделать это тоже. Выше я упомянул один способ, ниже второй, создав новый столбец с withColumn
-
for cl in columns: #already created columns variable
df = df.withColumn(cl, F.col("col").getItem(cl))
df.show(truncate=False)
+---------------------------+---+---+---+
|col |a |c |b |
+---------------------------+---+---+---+
|Map(b -> 2, c -> 3, a -> 1)|1 |3 |2 |
|Map(b -> 2, c -> 3, a -> 1)|1 |3 |2 |
|Map(b -> 2, c -> 3, a -> 1)|1 |3 |2 |
+---------------------------+---+---+---+