Apache spark 数组列Pypark上的计数器函数
从这个数据帧Apache spark 数组列Pypark上的计数器函数,apache-spark,pyspark,apache-spark-sql,counter,Apache Spark,Pyspark,Apache Spark Sql,Counter,从这个数据帧 +-----+-----------------+ |store| values | +-----+-----------------+ | 1|[1, 2, 3,4, 5, 6]| | 2| [2,3]| +-----+-----------------+ 我想应用计数器函数来获得: +-----+------------------------------+ |store| values
+-----+-----------------+
|store| values |
+-----+-----------------+
| 1|[1, 2, 3,4, 5, 6]|
| 2| [2,3]|
+-----+-----------------+
我想应用计数器
函数来获得:
+-----+------------------------------+
|store| values |
+-----+------------------------------+
| 1|{1:1, 2:1, 3:1, 4:1, 5:1, 6:1}|
| 2|{2:1, 3:1} |
+-----+------------------------------+
我用另一个问题的答案得到了这个数据框:
因此,我尝试修改答案中的代码,如下所示:
选项1:
def展平计数器(val):
返回计数器(减少(λx,y:x+y,val))
udf\u展平\u计数器=sf.udf(展平\u计数器,ty.ArrayType(ty.IntegerType()))
df3=df2。选择(“存储”,展平计数器(“值2”)。别名(“值3”))
df3.show(truncate=False)
选项2:
df.rdd.map(lambda r:(r.store,r.values)).reduceByKey(lambda x,y:x+y).map(lambda行:计数器(行[1]).toDF(['store',values')).show()
但它不起作用
有人知道我怎么做吗
谢谢您只需提供正确的数据类型
udf_flatten_counter = sf.udf(
lambda x: dict(Counter(x)),
ty.MapType(ty.IntegerType(), ty.IntegerType()))
df = spark.createDataFrame(
[(1, [1, 2, 3, 4, 5, 6]), (2, [2, 3])], ("store", "values"))
df.withColumn("cnt", udf_flatten_counter("values")).show(2, False)
# +-----+------------------+---------------------------------------------------+
# |store|values |cnt |
# +-----+------------------+---------------------------------------------------+
# |1 |[1, 2, 3, 4, 5, 6]|Map(5 -> 1, 1 -> 1, 6 -> 1, 2 -> 1, 3 -> 1, 4 -> 1)|
# |2 |[2, 3] |Map(2 -> 1, 3 -> 1) |
# +-----+------------------+---------------------------------------------------+
与RDD类似
df.rdd.mapValues(Counter).mapValues(dict).toDF(["store", "values"]).show(2, False)
# +-----+---------------------------------------------------+
# |store|values |
# +-----+---------------------------------------------------+
# |1 |Map(5 -> 1, 1 -> 1, 6 -> 1, 2 -> 1, 3 -> 1, 4 -> 1)|
# |2 |Map(2 -> 1, 3 -> 1) |
# +-----+---------------------------------------------------+
转换为dict
是必要的,因为显然辉绿岩无法处理计数器
对象