【问题标题】:Pyspark - Iterate through string to extract multiple key value pairsPyspark - 遍历字符串以提取多个键值对
【发布时间】:2021-03-13 00:00:41
【问题描述】:

我目前有一个用 & 分隔的文本字符串,我需要使用 PySpark 解析它以将键值对提取到数组/字典中。我可以使用字符串中的大多数标签来执行此操作,但问题是某些键具有索引,并且每个记录可能会有所不同,但键将始终相同(如果有意义的话。我想做的是,遍历字符串

示例输入:

"{pr1nm=Apples&pr1id=1111111&pr1pr=200.00&pr1qt=1&pr2nm=Pears&pr2id=1111112&pr2pr=300.00&pr2qt=2}"

期望的输出:

[{
  "ProductName":"Apples",
  "ProductId": "1111111",
  "ProductPrice":"200.00",
  "ProductQuantity":"1",
  "ProductName":"Pears",
  "ProductId":"1111112",
  "ProductPrice":"300.00"
  "ProductQuantity":"2"
}]

此外,如果我在同一字符串中有其他标签,这些标签与产品无关,例如:

"{dl=https://stackoverflow.com/posts/XXXXX&t=pageview&pr1nm=Apples&pr1id=1111111&pr1pr=200.00&pr1qt=1&pr2nm=Pears&pr2id=1111112&pr2pr=300.00&pr2qt=2}"

输出应该类似于嵌套数组中的产品:

{"DocumentLocation":"https://stackoverflow.com/posts/XXXXX",
  "HitType":"pageview",
   "Products": [{
                 "ProductName":"Apples",
                 "ProductId": "1111111",
                 "ProductPrice":"200.00",
                 "ProductQuantity":"1",
                 "ProductName":"Pears",
                 "ProductId":"1111112",
                 "ProductPrice":"300.00"
                 "ProductQuantity":"2"
               }]
}

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-dataframes


    【解决方案1】:

    您可以使用str_to_map 将字符串转换为映射列,如下所示:

    df = df.withColumn("input", expr("ltrim('{', rtrim('}', input))"))\
           .withColumn("input", expr("str_to_map(input, '&', '=')"))
    
    df.show(truncate=False)
    
    +-------------------------------------------------------------------------------------------------------------------------------+
    |input                                                                                                                          |
    +-------------------------------------------------------------------------------------------------------------------------------+
    |[pr1nm -> Apples, pr1id -> 1111111, pr1pr -> 200.00, pr1qt -> 1, pr2nm -> Pears, pr2id -> 1111112, pr2pr -> 300.00, pr2qt -> 2]|
    +-------------------------------------------------------------------------------------------------------------------------------+
    

    然后,如果你想要一个 JSON 字符串,使用 to_json 函数:

    df.withColumn("input", to_json(col("input"))) \
      .show(truncate=False)
    
    +--------------------------------------------------------------------------------------------------------------------------------+
    |input                                                                                                                           |
    +--------------------------------------------------------------------------------------------------------------------------------+
    |{"pr1nm":"Apples","pr1id":"1111111","pr1pr":"200.00","pr1qt":"1","pr2nm":"Pears","pr2id":"1111112","pr2pr":"300.00","pr2qt":"2"}|
    +--------------------------------------------------------------------------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多