按组收集?

时间:2017-03-20 17:51:48

标签: python hive

我正在使用Python编写的Hive包装器将Hive数据拉入Python Jupyter笔记本。我有数TB的数据如下:

Table 1: time=t1
uid   colA
1     A
1     B
1     C
2     A
2     B
3     C
3     D

我想从以上数据创建一个新的数据帧(PySpark / Pandas),如下所示:

Table 2: time=t1
uid   colA
1     [A, B, C]
2     [A, B]
3     [C, D]

其中colA是字符串列表。我该怎么做?我读过有关collect_set()的内容,但对其使用或适用性并不熟悉。

创建Table 2后,假设我有另一个time=t2表:

Table 3: time=t2
uid   colA
1     [A, B]
2     [B]
3     [C, D, E]

现在,我想计算table 2table 3之间的设置差异。它应返回3,因为这是从表3到表2所需的添加/删除次数。

1 个答案:

答案 0 :(得分:2)

以下是问题的总结解决方案。希望这对你来说可以使用pyspark。

全球进口: -

import pyspark.sql.functions as F
import pyspark.sql.types as T

表2创建代码: -

df1 = sc.parallelize([
        [1,'A'], [1,'B'], [1,'C'], [2,'A'], [2,'B'], [3, 'C'], [3,'D']
       ]).toDF(['uid', 'colA']).groupBy("uid").agg(F.collect_set("colA").alias("colA"))

df1.show()
+---+---------+
|uid|     colA|
+---+---------+
|  1|[A, B, C]|
|  2|   [A, B]|
|  3|   [C, D]|
+---+---------+

表3创建代码: -

df2 = sc.parallelize([[1, ['A', 'B']],[2, ['B']],[3, ['C', 'D', 'E']]]).toDF(['uid', 'colA'])
def diffUdfFunc(x,y):
    return list(set(y).difference(set(x)))

diffUdf = F.udf(diffUdfFunc,T.ArrayType(T.StringType()))
finaldf = df1.withColumnRenamed("colA", "colA1").join(df2, "uid").withColumnRenamed("colA", "colA2").withColumn("diffCol", diffUdf(F.col("colA1"), F.col("colA2")))
finaldf.select("uid", F.col("diffCol").alias("colA")).where(F.size("colA") > 0).show()
+---+----+
|uid|colA|
+---+----+
|  3| [E]|
+---+----+