如何在spark sql中查找两个连续数组项之间的差异

问题描述 投票:0回答:1

我有一个带有这样的数组列的数据集:

+--------+--------------------+
|user_id |array_of_items      |
+--------+--------------------+
|4049494 |[x1, x2, x3, x4, x5]|
|3046908 |[x6, x7, x8, x9]    |
...

如何在不使用 udf、仅使用 SQL 的情况下找到如下所示的数组?

+--------+----------------------------+
|user_id |array_of_items_diff         |
+--------+----------------------------+
|4049494 |[x2-x1, x3-x2, x4-x3, x5-x4]|
|3046908 |[x7-x6, x8-x7, x9-x8]       |
...
apache-spark apache-spark-sql
1个回答
0
投票

您可以使用transform功能:

df.selectExpr("""
    slice(
        transform(array_of_items, (x,i) -> array_of_items[i+1] || '-' || x)
      , 1 
      , size(array_of_items)-1
    ) as array_of_item_diff
""").show(2,0)
+----------------------------+
|array_of_item_diff          |
+----------------------------+
|[x2-x1, x3-x2, x4-x3, x5-x4]|
|[x7-x6, x8-x7, x9-x8]       |
+----------------------------+

如果您需要实际数学而不是串联,只需将

array_of_items[i+1] || '-' || x
更改为
array_of_items[i+1] - x

我使用

slice(...,1,size(array_of_items)-1)
删除最后一个为空的数组项。如果原始数组中没有空值项,您还可以使用 array_compact(spark 3.4.0+) 或 filter 函数删除结果空值。

© www.soinside.com 2019 - 2024. All rights reserved.