[dataframe regexp_extract from from string like array

问题描述 投票:0回答:2

我的DataFrame如下所示:

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

我需要提取数组中的marks并创建一个新的DataFrame。但是,无法提取DF中的第二个值(不知道如何通过正则表达式([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

先谢谢您。

python apache-spark pyspark pyspark-sql pyspark-dataframes
2个回答
1
投票

您可以分割字符串,然后使用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|
+---------+---+-----+------+---+

0
投票

您可以使用from_json将字符串列from_json转换为字符串数组。然后获取数组的元素以创建每一列。

但是,如果您不知道数组的大小,可以使用Marks函数将其转换为地图,然后分解地图并旋转以获取所需的输出。

transform

注意:transformtransform_expr = """transform(from_json(Marks, 'array<string>'), (x, i) -> struct(concat('C', i+1), x) ) """ df.select(col("*"), explode(map_from_entries(expr(transform_expr)))) \ .groupBy("StudentID").pivot("key").agg(first("value")) \ .show() #+---------+---+----+-----+---+ #|StudentID|C1 |C2 |C3 |C4 | #+---------+---+----+-----+---+ #|100 |20 |25.5|40.23|50 | #|200 |30 |20 |25 |40 | #|300 |20 |25 |50 |35 | #+---------+---+----+-----+---+ 功能仅适用于Spark 2.4 +

© www.soinside.com 2019 - 2024. All rights reserved.