使用Spark Dataframe API计算列中的特定字符

时间:2017-11-07 10:22:11

标签: apache-spark pyspark spark-dataframe

我在Spark Dataframe df中有一个包含位的列。列是格式的字符串:

10001010000000100000000000000000
10001010000000100000000100000000

是否有一种简单有效的方法来创建新列"no_of_ones"并使用Dataframe计算频率?使用RDD我可以map(lambda x:x.count('1'))(pyspark)。 另外,如何检索列表的位置?

2 个答案:

答案 0 :(得分:7)

我能想到的一种方法是删除所有零,然后计算字段的长度。

df.show
+--------------------+
|          bytestring|
+--------------------+
|10001010000000100...|
|10001010000000100...|
+--------------------+


df.withColumn("no_of_ones" , length(regexp_replace($"bytestring", "0", "")) ).show
+--------------------+----------+
|          bytestring|no_of_ones|
+--------------------+----------+
|10001010000000100...|         4|
|10001010000000100...|         5|
+--------------------+----------+

答案 1 :(得分:1)

通常,当您在(py)spark SQL的预定义函数中找不到所需内容时,您可以编写一个用户定义函数(UDF)来执行您想要的任何操作(请参阅UDF)。

请注意,在您的情况下,编码良好的udf可能比scala或java中的正则表达式解决方案更快,因为您不需要实例化新字符串并编译正则表达式(for循环可以)。但是在pyspark中它可能会慢得多,因为在执行程序上执行python代码总是严重损害性能。