【问题标题】:Scala Dataframe column split URL parameters to new columnsScala Dataframe 列将 URL 参数拆分为新列
【发布时间】:2022-01-27 07:14:22
【问题描述】:

我的数据框中有一列中有 URL 数据,我需要从查询字符串中解析出参数并为其创建新列。

有时参数会存在,有时它们不会存在,并且它们不是特定的保证顺序,因此我需要能够按名称找到它们。我正在 Qcala 中编写此代码,但语法不正确,希望得到一些帮助。

我的代码:


val df = Seq(
  (1, "https://www.mywebsite.com/dummyurl/single?originlatitude=35.0133612060147&originlongitude=-116.156211232302&origincountrycode=us&originstateprovincecode=ca&origincity=boston&originradiusmiles=250&datestart=2021-12-23t00%3a00%3a00"),
  (2, "https://www.mywebsite.com/dummyurl/single?originlatitude=19.9141319141121&originlongitude=-56.1241881401291&origincountrycode=us&originstateprovincecode=pa&origincity=york&originradiusmiles=100&destinationlatitude=40.7811012268066&destinationlon")
).toDF("key", "URL")

val result = df

// .withColumn("param_name", $"URL")
.withColumn("parsed_url", explode(split(expr("parse_url(URL, 'QUERY')"), "&")))
.withColumn("parsed_url2", split($"parsed_url", "="))
// .withColumn("exampletest",$"URL".map(kv: String => (kv.split("=")(0), kv.split("=")(1))) )
.withColumn("Search_OriginLongitude", split($"URL","\\?"))
.withColumn("Search_OriginLongitude2", split($"Search_OriginLongitude"(1),"&"))

//   .map(kv: Any => (kv.split("=")(0), kv.split("=")(1)))
//   .toMap
//   .get("originlongitude"))

display(result)

期望的结果:

+---+--------------------+--------------------+--------------------+
|KEY|                 URL|     originlatitude |    originlongitude |
+---+--------------------+--------------------+--------------------+
|  1|https://www.myweb...| 35.0133612060147   | -116.156211232302  |
|  2|https://www.myweb...| 19.9141319141121   | -56.1241881401291  |
+---+--------------------+--------------------+--------------------+

【问题讨论】:

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


    【解决方案1】:

    parse_url函数实际上可以带第三个参数key作为你要提取的查询参数名称,像这样:

    val result = df
      .withColumn("Search_OriginLongitude", expr("parse_url(URL, 'QUERY', 'originlatitude')"))
      .withColumn("Search_OriginLongitude2", expr("parse_url(URL, 'QUERY', 'originlongitude')"))
    
    result.show
    //+---+--------------------+----------------------+-----------------------+
    //|key|                 URL|Search_OriginLongitude|Search_OriginLongitude2|
    //+---+--------------------+----------------------+-----------------------+
    //|  1|https://www.myweb...|      35.0133612060147|      -116.156211232302|
    //|  2|https://www.myweb...|      19.9141319141121|      -56.1241881401291|
    //+---+--------------------+----------------------+-----------------------+
    

    或者您可以使用str_to_map 函数创建parameter->value 的地图,如下所示:

    val result = df
      .withColumn("URL", expr("str_to_map(split(URL,'[?]')[1],'&','=')"))
      .withColumn("Search_OriginLongitude", col("URL").getItem("originlatitude"))
      .withColumn("Search_OriginLongitude2", col("URL").getItem("originlongitude"))
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2016-11-17
      • 1970-01-01
      • 2018-09-29
      • 2020-04-24
      相关资源
      最近更新 更多