我想从 Spark SQL split() 函数返回的数组中获取最后一个元素。
split(4:3-2:3-5:4-6:4-5:2,'-')
Run Code Online (Sandbox Code Playgroud)
我知道它可以过去
split(4:3-2:3-5:4-6:4-5:2,'-')[4]
Run Code Online (Sandbox Code Playgroud)
但是当我不知道 Array 的长度时,我想要另一种方式。请帮我。
小智 17
您还可以在 Split() 之后的列上使用 SparkSql Reverse() 函数。例如:
SELECT reverse(split(MY_COLUMN,'-'))[0] FROM MY_TABLE
这里[0]给出了反转数组的第一个元素,它是初始数组的最后一个元素。
请检查substring_index它应该完全按照您的意愿工作:
substring_index(lit("1-2-3-4"), "-", -1) // 4
Run Code Online (Sandbox Code Playgroud)
您可以使用 UDF 来执行此操作,如下所示:
val df = sc.parallelize(Seq((1L,"one-last1"), (2L,"two-last2"), (3L,"three-last3"))).toDF("key","Value")
+---+-----------+
|key|Value |
+---+-----------+
|1 |one-last1 |
|2 |two-last2 |
|3 |three-last3|
+---+-----------+
val get_last = udf((xs: Seq[String]) => Try(xs.last).toOption)
val with_just_last = df.withColumn("Last" , get_last(split(col("Value"), "-")))
+---+-----------+--------+
|key|Value |Last |
+---+-----------+--------+
|1 |one-last1 |last1 |
|2 |two-last2 |last2 |
|3 |three-last3|last3 |
+---+-----------+--------+
Run Code Online (Sandbox Code Playgroud)
请记住, SparkSQL 的split函数可以应用于 DataFrame 的列。
| 归档时间: |
|
| 查看次数: |
9093 次 |
| 最近记录: |