我有一列spark-dataframe
df.select('parsed').show()
的输出:
+--------------------+
| parsed|
+--------------------+
|{Action Flags=I, ...|
|{Action Flags=I, ...|
|{Action Flags=I, ...|
|{Action Flags=I, ...|
+--------------------+
此列的所有元素都是字典。
如何使用键作为列名从字典中创建新的spark-dataframe
?
答案 0 :(得分:0)
在从以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 |
+---------------------------+---+---+---+