spark根据名称将值提取到多列

kokeuurv  于 2021-05-18  发布在  Spark
关注(0)|答案(2)|浏览(501)

我有一个字符串列,需要根据与它关联的名称将它的值提取到多个列中。

otherPartofString State DALLocate_SFO-4/3/9 sub Area=<8> ID 8 Name 7

需要从上面形成的柱是

State     | Area      | Sub Area | ID | Name
DALLocate | SFO-4/3/9 | 8        | 8  | 7

感谢您的帮助。

wmvff8tz

wmvff8tz1#

如果模式总是固定的,您可以使用regexp\u extract:

from pyspark.sql.functions import regexp_extract

df = spark.createDataFrame([{"raw": "otherPartofString State DALLocate_SFO-4/3/9 sub Area=<8> ID 8 Name 7 "}], 'raw string') 

(df
 .select(regexp_extract('raw', 'State ([^_]*)', 1).alias('State'), 
         regexp_extract('raw', 'State ([a-zA-Z]*)_([^ ]*)', 2).alias('Area'), 
         regexp_extract('raw', 'Area=<(.*)>', 1).alias('Sub Area'), 
         regexp_extract('raw', 'ID ([^ ]*)', 1).alias('ID'),
         regexp_extract('raw', 'Name ([^ ]*)', 1).alias('Name')).show())
``` `regexp_extract` 获取3个参数,第一个参数是要匹配的列。第二个是模式,第三个是要提取的组。
裁判:https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.regexp_extract
2izufjch

2izufjch2#

试试这个:

import org.apache.spark.sql.functions.udf
def myFunc: String => Array[String] = s => Array(/* TODO parse the string as you wish */)
val myUDF = udf(myFunc)

df.withColumn("parsedInput", myUDF(df("input")))
  .select(
    $"parsedInput"(0).as("State"),
    $"parsedInput"(1).as("Area"),
    $"parsedInput"(2).as("Sub Area"),
    $"parsedInput"(3).as("ID"),
    $"parsedInput"(4).as("Name"))

其中“input”是您的原始输入(例如,“otherpartofstring state dallogate\u sfo-4/3/9 sub area=<8>id 8 name 7”)。
确保您的自定义项返回一个有效的数组(项目数和顺序)

相关问题