将pyspark字符串列转换为pyspark Dataframe 中的新列

xu3bshqb  于 2023-08-02  发布在  Spark
关注(0)|答案(2)|浏览(119)

我正在使用databricks,并有一个spark dataframe如下:
| 伊达|国际识别系统|模式| mode |
| --|--|--| ------------ |
| 公司简介|TRHRYR-365|全部| all |
| 公司简介|特雷特-123|一些| some |
我想根据每个字典中的fname在dataframe中创建新列(name 1,name 2,name 3,name 4-每个都成为dataframe中的新列),然后关联的值是该列的数据。
我尝试了各种方法,比如将数据转换为json,但似乎仍然无法让它工作。我希望能够使用PySpark完成此操作,然后删除数据列,因为不再需要此列。

vybvopom

vybvopom1#

你试过使用一个udf来收集每个键的值吗?举例来说:

from pyspark.sql import functions as F

@F.udf(FloatType())
def get_value_from_list(name: str, data_list: list[dict]) -> float:
    for item in data_list:
        if item["fname"] == name:
            return float(item['value'])
    return None

col_names = ['name1', 'name2', 'name3', 'name4']

for col in col_names:
    df = df.withColumn(col, get_value_from_list(F.lit(col), F.col("data")))
df = df.drop("data")

字符串

j8yoct9x

j8yoct9x2#

我通过将spark数据框转换为sql视图,然后运行下面的sql代码来解决这个问题。
首先,从dataframe创建一个视图:

df.createOrReplaceTempView("view_df")

字符串
然后使用SQL创建一个新的spark dataframe:

new_df = spark.sql("""SELECT
ida,
ids,
mode,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, 'fname=name1, value=', -1), '}', 1) AS STRING) AS name1,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, 'fname=name2, value=', -1), '}', 1) AS STRING) AS name2,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, 'fname=name3, value=', -1), '}', 1) AS STRING) AS name3,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, 'fname=name4, value=', -1), '}', 1) AS STRING) AS name4
FROM view_df""")


不是最有效的方法,但结果完全符合我的要求。

相关问题