首页 > 解决方案 > 数据框 regexp_extract 从字符串中提取值,如数组

问题描述

我的 DataFrame 如下所示:

StudentID          Marks
100                ["20", "25.5", "40.23", "50"]
200                ["30", "20", "25", "40"]
300                ["20", "25", "50", "35"]

我需要marks在数组中提取并创建一个新的 DataFrame。但是,我无法提取超出 DF 中的第二个值(不知道如何通过 regex 选择所有标记([0-9]+)(?:\.[0-9]+){3}

df1.select(regexp_extract('StudentID', '(\w+)(,)', 1).alias("C1"), 
             regexp_extract('Marks', '([0-9]+)(?:\.[0-9]+){3}', 0).alias("C2"))

最终,需要创建一个具有以下格式的新 DataFrame:

StudentID  C1    C2    C3     C4
100        20    25.5  40.23  50
200        30    20    25     40
300        20    25    50     35

先感谢您。

标签: pythonapache-sparkpysparkapache-spark-sqlpyspark-dataframes

解决方案


您可以拆分字符串,然后使用element_at将子字符串拉到单独的列中:

df1.withColumn("marks_array", split( regexp_replace(col("Marks"), "\\[|\\]|\"", ""), ",")  )
      .withColumn("C1", element_at(col("marks_array"), 1))
      .withColumn("C2", element_at(col("marks_array"), 2))
      .withColumn("C3", element_at(col("marks_array"), 3))
      .withColumn("C4", element_at(col("marks_array"), 4))
      .drop("marks_array", "Marks")
      .show(false)
+---------+---+-----+------+---+
|StudentID|C1 |C2   |C3    |C4 |
+---------+---+-----+------+---+
|100      |20 | 25.5| 40.23| 50|
|200      |30 | 20  | 25   | 40|
|300      |20 | 25  | 50   | 35|
+---------+---+-----+------+---+

推荐阅读