【问题标题】:substring from lastIndexOf in spark scalaspark scala中lastIndexOf的子字符串
【发布时间】:2020-03-06 10:26:51
【问题描述】:

我的数据框中有一列包含文件名

test_1_1_1_202012010101101

我想获取 lastIndexOf(_) 之后的字符串 我试过了,它正在工作

val timestamp_df =file_name_df.withColumn("timestamp",split(col("filename"),"_").getItem(4))

但我想让它更通用,以便将来如果文件名中可以​​包含任意数量的_,它可以在lastIndexOf_的基础上对其进行拆分

val timestamp_df =file_name_df.withColumn("timestamp", expr("substring(filename, length(filename)-15,17)"))

这也不是通用的,因为字符长度可以变化。

谁能帮我将 lastIndexOf 函数与 withColumn 一起使用。

【问题讨论】:

标签: scala apache-spark


【解决方案1】:

您可以使用 element_at 函数和 split 来获取数组的最后一个元素。

Example:

df.withColumn("timestamp",element_at(split(col("filename"),"_"),-1)).show(false)
+--------------------------+---------------+
|filename                  |timestamp      |
+--------------------------+---------------+
|test_1_1_1_202012010101101|202012010101101|
+--------------------------+---------------+

【讨论】:

    【解决方案2】:

    你可以使用substring_index

    scala> val df = Seq(("a-b-c", 1),("d-ef-foi",2)).toDF("c1","c2")
    df: org.apache.spark.sql.DataFrame = [c1: string, c2: int]
    
    +--------+---+
    |      c1| c2|
    +--------+---+
    |   a-b-c|  1|
    |d-ef-foi|  2|
    +--------+---+
    
    scala> df.withColumn("c3", substring_index(col("c1"), "-", -1)).show
    +--------+---+---+
    |      c1| c2| c3|
    +--------+---+---+
    |   a-b-c|  1|  c|
    |d-ef-foi|  2|foi|
    +--------+---+---+
    
    

    根据docs:当最后一个参数“为负时,返回最后一个分隔符右侧(从右侧开始计数)的所有内容”

    【讨论】:

      【解决方案3】:
      val timestamp_df =file_name_df.withColumn("timestamp",reverse(split(reverse(col("filename")),"_").getItem(0)))
      

      它正在处理这个。

      【讨论】:

      • 当您可以使用一个 element_at -1(最后一个值)时,使用两个反向是反直觉的。如果您使用的是 spark 2.4,element_at 将是最高效的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 2018-05-16
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多