如何从另一个Dataframe创建转置的Dataframe

kq0g1dla  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(360)

我从外部文件创建了一个dataframe df,它具有以下模式:
(id,field1,field2,field3)分区列:id
数据示例为

000,  11_field1,  22_field2,  33_field3
 001, 111_field1, 222_field2, 333_field3

我想从df创建另一个dataframe,其中schema是

(id, fieleName, fieldValue)

数据示例为

000, field1,  11_field1
000, field2,  22_field2
000, field3,  33_field3
001, field1, 111_field1
001, field2, 222_field2
001, field3, 333_field3

有人能告诉我怎么得到新的Dataframe吗?

vom3gejh

vom3gejh1#

你可以在 pyspark 如下所示使用 explode 选项
首先导入必要的库和函数

from pyspark.sql import SQLContext, Row

假设你的数据框是 df .
如果你这样做了 df.show() 你应该得到如下结果

+---+----------+----------+----------+
| id|    field1|    field2|    field3|
+---+----------+----------+----------+
|  0| 11_field1| 22_field2| 33_field3|
|  1|111_field1|222_field2|333_field3|
+---+----------+----------+----------+

然后将所有要分解的列Map为2列。这里您希望除id之外的所有列都分解。所以,做下面这些

cols= df.columns[1:]

然后转换 data framerdd 就像下面一样

rdd = data.rdd.map(lambda x: Row(id=x[0], val=dict(zip(cols, x[1:]))))

要检查rdd是如何Map的,请执行以下操作

rdd.take()

你会得到如下结果

[Row(id=0, val={'field2': u'22_field2', 'field3': u'33_field3', 'field1': u'11_field1'}), Row(id=1, val={'field2': u'222_field2', 'field3': u'333_field3', 'field1': u'111_field1'})]

然后转换 rdd 回到a data framedf2 ```
df2 = sqlContext.createDataFrame(rdd)

那就做吧 `df2.show()` . 你应该得到如下结果

+---+--------------------+
| id| val|
+---+--------------------+
| 0|Map(field3 -> 33_...|
| 1|Map(field3 -> 333...|
+---+--------------------+

然后将Dataframedf2注册为temp表

df2.registerTempTable('mytempTable')

然后在数据框上运行如下查询:

df3 = sqlContext.sql( """select id,explode(val) AS (fieldname,fieldvalue) from mytempTable""")

那就做吧 `df3.show()` ,你应该得到如下结果

+---+---------+----------+
| id|fieldname|fieldvalue|
+---+---------+----------+
| 0| field3| 33_field3|
| 0| field2| 22_field2|
| 0| field1| 11_field1|
| 1| field3|333_field3|
| 1| field2|222_field2|
| 1| field1|111_field1|
+---+---------+----------+

相关问题