【问题标题】:Get the last element from Apache Spark SQL split() Function从 Apache Spark SQL split() 函数中获取最后一个元素
【发布时间】:2019-10-16 04:28:44
【问题描述】:

我想从 Spark SQL split() 函数返回的 Array 中获取最后一个元素。

split(4:3-2:3-5:4-6:4-5:2,'-')

我知道它可以通过

split(4:3-2:3-5:4-6:4-5:2,'-')[4]

但是当我不知道 Array 的长度时,我想要另一种方法。 请帮帮我。

【问题讨论】:

  • List你可以使用last
  • 你的意思是这样的。最后(分裂(4:3-2:3-5:4-6:4-5:2,'-'))。我试过了。但它不起作用。

标签: apache-spark-sql


【解决方案1】:

您还可以在 Split() 之后的列上使用 SparkSql Reverse() 函数。 例如:

SELECT reverse(split(MY_COLUMN,'-'))[0] FROM MY_TABLE

这里[0] 为您提供反转数组的第一个元素,它是初始数组的最后一个元素。

【讨论】:

  • 好建议!比恕我直言接受的答案更好,因为它是可移植的并且不需要 UDF。
  • 绝对是最佳答案,谢谢!
【解决方案2】:

请检查substring_index 它应该完全按照您的意愿工作:

substring_index(lit("1-2-3-4"), "-", -1) // 4

【讨论】:

  • substring_index 的文档中指定了 -1 的使用,因此这应该比反向和拆分更好
【解决方案3】:

您可以使用 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   |
+---+-----------+--------+

请记住,SparkSQL 中的 split 函数可以应用于 DataFrame 的列。

【讨论】:

  • 感谢您的建议。我正在使用 java。我将在 java 上尝试。
【解决方案4】:

如果您使用 Java,请使用 split(MY_COLUMN,'-').getItem(0)

【讨论】:

  • 这就是你获得第一个元素的方式。 OP 要求最后一个
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多