如何将分组数据存储到pyspark中的json中

时间:2016-02-27 17:58:14

标签: apache-spark dataframe pyspark apache-spark-sql pyspark-sql

我是pyspark的新手

我有一个看起来像的数据集(只是几列的快照)

data description

我想按密钥对数据进行分组。我的关键是

k1[{v1,v2,....},{v1,v2,....}], k2[{v1,v2,....},{v1,v2,....}],....

我的最终目标是将数据转换为JSON,格式如下

248138339 [{ PRECIMA_ID:SCP 00248 0000138339, PROD_NBR:5553505, PROD_DESC:Shot and a Beer Battered Onion Rings (5553505 and 9285840) , PROD_BRND:Molly's Kitchen,PACK_SIZE:4/2.5 LB, QTY_UOM:CA } , 
        { PRECIMA_ID:SCP 00248 0000138339 , PROD_NBR:6659079 , PROD_DESC:Beef Chuck Short Rib Slices, PROD_BRND:Stockyards , PACK_SIZE:12 LBA , QTY_UOM:CA} ,{...,...,} ],

e.g

joinstmt = sqlContext.sql(
          "SELECT a.precima_id , CONCAT(a.div_nbr,a.cust_nbr) as
                  key,a.prod_nbr , a.prod_desc,a.prod_brnd ,      a.pack_size , a.qty_uom , a.sales_opp , a.prc_guidance , a.pim_mrch_ctgry_desc , a.pim_mrch_ctgry_id , b.start_date,b.end_date 

1384611034793 [{},{},{}],...

我创建了一个数据框(我基本上要加入两个表以获得更多字段)

groupbydf = joinstmt.groupBy("key")

FROM scoop_dtl a join scoop_hdr b on(a.precima_id = b.precima_id)“)

现在,为了获得上述结果,我需要根据键对结果进行分组,我做了以下

<h1 class="text-primary">your title</h1>

这导致了一个分组数据,读完后我知道我不能直接使用它,我需要将它转换回数据帧来存储它。

我是新手,需要一些帮助以便将其转换回数据帧,或者如果还有其他方法我会很感激。

2 个答案:

答案 0 :(得分:4)

如果您的联接数据框如下所示:

gender  age
M   5
F   50
M   10
M   10
F   10

然后,您可以使用以下代码获得所需的输出

joinedDF.groupBy("gender") \ 
    .agg(collect_list("age").alias("ages")) \
    .write.json("jsonOutput.txt")

输出如下所示:

{"gender":"F","ages":[50,10]}
{"gender":"M","ages":[5,10,10]}

如果您有多个列,例如姓名,薪水。您可以添加如下列:

df.groupBy("gender")
    .agg(collect_list("age").alias("ages"),collect_list("name").alias("names"))

您的输出如下:

{"gender":"F","ages":[50,10],"names":["ankit","abhay"]}
{"gender":"M","ages":[5,10,10],"names":["snchit","mohit","rohit"]}

答案 1 :(得分:2)

您无法直接使用GroupedData。它必须首先汇总。可以通过使用collect_list等内置函数进行聚合来部分地覆盖它,但是使用DataFrameWriter来实现所需的输出是不可能的,其中值用于表示键。

In可以尝试这样的事情:

from pyspark.sql import Row
import json

def make_json(kvs):
  k, vs = kvs
  return json.dumps({k[0]: list(vs)})

(df.select(struct(*keys), values)
    .rdd
    .mapValues(Row.asDict)
    .groupByKey()
    .map(make_json))

saveAsTextFile