pyspark - 加入数组交点
问题描述
您好,我想加入阵列交叉点。我在 spark 上找到了一个 arrays_overlap 函数——但我似乎无法让它工作。我也尝试编写自定义 UDF 无济于事。我收到的错误消息是“需要多个孩子的属性”。我不知道这意味着什么使它难以调试。我错过了一些基本的东西吗?使用蜂巢/pyspark
示例查询:
select
a.id
from tbl a
JOIN tbl_b b
ON arrays_overlap(a.my_arr, b.my_arr) = TRUE
def _arrays_overlap(a,b):
for item in a:
if item in b:
return True
return False
spark.udf.register(
"_arrays_overlap",
_arrays_overlap,
BooleanType()
)
select
a.id
from tbl a
JOIN tbl_b b
ON _arrays_overlap(a.my_arr, b.my_arr) = TRUE
我在这里想念什么?
解决方案
来自Spark-2.4
:
我们可以使用array_intersect
带有大小的函数来仅连接行大小!= 0。
- (或)
arrays_overlap
并加入布尔值TRUE
Example:
df=spark.createDataFrame([(1,[1,2,3]),(2,[4,5])],["id","my_arr"])
df1=spark.createDataFrame([(1,[2,3]),(2,[8,9])],["id","my_arr"])
df.createOrReplaceTempView("tbl")
df1.createOrReplaceTempView("tbl_b")
spark.sql("select a.id from tbl a join tbl_b b on arrays_overlap(a.my_arr,b.my_arr) = TRUE").show()
spark.sql("select a.id from tbl a join tbl_b b on SIZE(array_intersect(a.my_arr,b.my_arr)) != 0").show()
#+---+
#| id|
#+---+
#| 1|
#+---+
推荐阅读
- flask - 使用线程运行 gunicorn
- ios - 设置 UIImage 颜色
- java - Liquibase Gradle 插件正在生成的更改日志中删除休眠序列表
- java - Java 将带有自动模块的模块打包到 JAR 中
- postgresql-9.6 - 用于大型且持续更新的表的 Postgres 慢速嵌套循环反连接
- javascript - 我正在尝试使用 nodejs 从 mongodb 集合中检索数据,但我必须请求两次才能获得正确的信息
- python - 为什么我的代码会删除文件夹中的所有内容?
- c++ - 将 *this 作为参数传递给线程调用的方法
- amazon-web-services - 您可以通过 AWS CLI 为 AWS Lambda 函数创建测试事件吗?
- .net-core - FindOneAndUpdateAsync 间歇性返回 Null