我有一个带有这样的数组列的数据集:
+--------+--------------------+
|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] |
...
您可以使用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 函数删除结果空值。