【问题标题】:How to extract the last element from a comma-delimited string?如何从逗号分隔的字符串中提取最后一个元素?
【发布时间】:2018-09-05 13:36:47
【问题描述】:

使用这个查询:

sql("SELECT _location, count(1) FROM tablaTemporal group by _location order by 2 desc" )

我收到这个输出:

+--------------------------------+--------+
|_location                       |count(1)|
+--------------------------------+--------+
|London, United Kingdom          |15      |
|United States                   |12      |
|Bangalore, India                |8       |
|Hyderabad, India                |7       |
|Paris, France                   |6       |
|San Francisco, CA, United States|6       |
|Mountain View, CA, United States|4       |
|Pune, India                     |4       |
|Bengaluru, Karnataka, India     |3       |
+--------------------------------+--------+

但我需要的结果是:

+--------------------------------+--------+
|_location                       |count(1)|
+--------------------------------+--------+
|United States                   |22      |
|India                           |22      | 
|United Kingdom                  |15      |
|France                          |6       |
+--------------------------------+--------+

因此,我需要使用一些类似的句子:

sql("SELECT SubstringOfLocationFromCharComma(_location), count(1) FROM tablaTemporal group by _location order by 2 desc" )

如何从逗号分隔的字符串中提取最后一个元素?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    由于国家名称是逗号后的最后一个元素,你也可以这样做:

    df.show(false)
    +--------------------------------+
    |a                               |
    +--------------------------------+
    |Mountain View, CA, United States|
    |Pune, India                     |
    |Bengaluru, Karnataka, India     |
    +--------------------------------+
    
    
    df.withColumn("a" , split($"a", ",") ).withColumn("a" , expr("a[ size(a) -1 ] ") ).show
    +--------------+
    |a             |
    +--------------+
    | United States|
    | India        |
    | India        |
    +--------------+
    

    这将跟一个groupBy($"a").agg(sum($"count(1)").as("count")) 以达到预期的结果。

    【讨论】:

      【解决方案2】:

      你可以使用regexp_extract

      import org.apache.spark.sql.functions._
      
      val df = Seq(
        "London, United Kingdom", "Bengaluru, Karnataka, India"
      ).toDF("_location")
      
      df.select(regexp_extract($"_location", ".*,([^,]*)$", 1).alias("country")).show
      
      // +---------------+
      // |        country|
      // +---------------+
      // | United Kingdom|
      // |          India|
      // +---------------+
      

      【讨论】:

      • 有这样的说法,当你遇到问题并使用正则表达式来解决它时,你会立即遇到两个问题:) 好的 ol' split 函数有什么问题?
      • @JacekLaskowski 这不是可怜的开发者所说的吗? ? 但是除了冗长之外,split + length + getItem 不够灵活,即使有一点偏差,也会变得毫无用处或变成case ... when 地狱。更何况split已经是一个正则表达式解决方案了。
      • 无法正常工作 StackOverflow.scala:106: value $ 不是 StringContext [error] val df2 = df.select(regexp_extract($"_location", ".*,([^, ]*)$", 1).alias("locationSplitted")) 可能是因为我正在使用 sbt
      • 因为你在stackoverflow.com/q/44209756/8371915范围内没有隐式转换
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多