如何透视Pyspark流数据框架

时间:2019-11-30 14:04:53

标签: pyspark pivot spark-streaming spark-structured-streaming pyspark-dataframes

我在pyspark结构化流中接收流数据,我需要对其进行透视,以便可以从该数据中获得一行。

进入集群的数据结构是:

{
"version": 1.0.0,
"message": {
   "data": [{
    "name": "name_1", 
    "value": 1.0},
    ...
   {
    "name": "name_2", 
    "value": 2.0}]
 }
}

我的代码如下:

dfStreaming = spark \
  .readStream \
  .format("eventhubs") \
  .options(**optionConf()) \
  .load() \
  .select(explode("message.data").alias("data")) \
  .select(("data.*")) \

我得到以下结果数据框:

|---------------------|------------------|
|         Name        |       Value      |
|---------------------|------------------|
|        Name_1       |         1.0      |
|---------------------|------------------|
|        Name_2       |         2.0      |
|---------------------|------------------|

但是我需要以下结构(实际上是表的枢轴):

|---------------------|------------------|
|        Name_1       |      Name_2      |
|---------------------|------------------|
|         1.0         |        2.0       |
|---------------------|------------------|

不允许以流数据帧为中心,但是我想应该有一个解决方案。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

解决方案是在重新创建数据帧的行时添加一些聚合。

dfStreaming = spark \
  .readStream \
  .format("eventhubs") \
  .options(**optionConf()) \
  .load() \
  .select(explode("message.data").alias("data")) \
  .select(("data.*")) \
  .selectexpr(["sum(case when Name=Name_of_desired_column then Value else null) as Name_of_desired_column"])