如何从另一个数据框中的字典创建数据框?

时间:2019-04-23 14:20:00

标签: python pyspark apache-spark-sql

我有一列spark-dataframe
df.select('parsed').show()的输出:

+--------------------+
|              parsed|
+--------------------+
|{Action Flags=I, ...|
|{Action Flags=I, ...|
|{Action Flags=I, ...|
|{Action Flags=I, ...|
+--------------------+

此列的所有元素都是字典。
如何使用键作为列名从字典中创建新的spark-dataframe

1 个答案:

答案 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  |
+---------------------------+---+---+---+