pyspark dataframe将所有键连接到collect_list()值

时间:2017-08-22 21:16:04

标签: python apache-spark pyspark pyspark-sql

我有一个pyspark数据框,其中包含表格的键和值列表:

    k1,v1
    k2,v2
    k3,v3

我想创建:

    k1,[v1,v2,v3]
    k2,[v1,v2,v3]
    k3,[v1,v2,v3]

因为我发现k1 = k2 = k3。我知道这将涉及collect_list(),但我仍然不确定如何获得所需的输出。

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作

{{1}}

答案 1 :(得分:0)

您可以尝试此操作,收集列表将收集与foreach($lang as $myrow) { fputcsv($output, $myrow); } k1对应的所有值,以确定值是否可以重复多次。

以下是我们如何做到这一点: - 从pyspark.sql导入函数为F

k2

如果您需要删除重复: -

n = sqlContext.createDataFrame([
        ["k1", "v1"], 
        ["k1", "v2"], 
        ["k1", "v3"], 
        ["k1", "v1"], 
        ["k2", "v1"], 
        ["k2", "v2"], 
        ["k2", "v3"], 
        ["k2", "v1"], 
    ], ["col1", "col2"])
n.show()
+----+----+
|col1|col2|
+----+----+
|  k1|  v1|
|  k1|  v2|
|  k1|  v3|
|  k1|  v1|
|  k2|  v1|
|  k2|  v2|
|  k2|  v3|
|  k2|  v1|
+----+----+
n.groupby("col1").agg(F.collect_list("col2")).show()

+----+------------------+
|col1|collect_list(col2)|
+----+------------------+
|  k1|  [v1, v2, v3, v1]|
|  k2|  [v1, v2, v3, v1]|
+----+------------------+

答案 2 :(得分:0)

使用@Rakesh数据框n,可以通过汇总和收集来创建数据框m

m = n.groupby("col1").agg(F.collect_set("col2").cast('string').alias('set'))

m.show()

输出:

+----+----------+
|col1|       set|
+----+----------+
|  k2|[v2,v3,v1]|
|  k1|[v2,v3,v1]|
+----+----------+

并连接它们:

m.select(F.concat(m.col1, F.lit(','), m.set).alias('concatenated')).show()

输出:

+-------------+
| concatenated|
+-------------+
|k2,[v2,v3,v1]|
|k1,[v2,v3,v1]|
+-------------+