我在Spark Dataframe df
中有一个包含位的列。列是格式的字符串:
10001010000000100000000000000000
10001010000000100000000100000000
是否有一种简单有效的方法来创建新列"no_of_ones"
并使用Dataframe计算频率?使用RDD我可以map(lambda x:x.count('1'))
(pyspark)。
另外,如何检索列表的位置?
答案 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代码总是严重损害性能。