我正在使用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 2
和table 3
之间的设置差异。它应返回3,因为这是从表3到表2所需的添加/删除次数。
答案 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]|
+---+----+