【发布时间】:2017-09-03 10:39:45
【问题描述】:
我想将一列的值与具有参考值范围的另一列进行比较。
我已尝试使用以下代码:
from pyspark.sql.functions import udf, size
from pyspark.sql.types import *
df1 = sc.parallelize([([1], [1, 2, 3]), ([2], [4, 5, 6,7])]).toDF(["value", "Reference_value"])
intersect = lambda type: (udf(
lambda x, y: (
list(set(x) & set(y)) if x is not None and y is not None else None),
ArrayType(type)))
integer_intersect = intersect(IntegerType())
# df1.select(
# integer_intersect("value", "Reference_value"),
# size(integer_intersect("value", "Reference_value"))).show()
df1=df1.where(size(integer_intersect("value", "Reference_value")) > 0)
df1.show()
如果我们创建如下数据框,上面的代码就可以工作:
因为 value 和 referencence_value 列是 array_type 和 long_type 但是如果我正在使用 csv 读取数据帧,那么我将无法转换为数组类型。这里 df1 是从 CSV 读取的
df1 is as follows df1=
category value Reference value
count 1 1
n_timer n20 n40,n20
frames 54 56
timer n8 n3,n6,n7
pdf FALSE TRUE
zip FALSE FALSE
我想将“value”列与“Reference_value”列进行比较,并导出两个新数据框,如果 value 列不在参考值集中,则一个数据框用于过滤行。
输出 df2=
category value Reference value
count 1 1
n_timer n20 n40,n20
zip FALSE FALSE
输出 df3=
category value Reference value
frames 54 56
timer n8 n3,n6,n7
pdf FALSE TRUE
有没有像array_contains 这样更简单的方法。我尝试了 Array_contains 但没有工作
from pyspark.sql.functions import array_contains
df.where(array_contains("Reference_value", df1["vale"]))
【问题讨论】:
标签: python apache-spark pyspark