Dataframe PySpark,如何解析格式为dict的字符串并将一些键附加为新列

Dataframe PySpark,如何解析格式为dict的字符串并将一些键附加为新列,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我在读取带有奇怪列的csv文件时遇到了一个问题 模式 根目录 |--Id:integer(nullable=true) |--Lon_塔:双(可空=真) |--Lat_塔:双精度(可空=真) |--Compagny:string(nullable=true) |--地址:字符串(nullable=true) |--分配的\u波段\u 1:字符串(可空=真) |--赋值带2:字符串(可空=真) |--赋值带3:字符串(可空=真) |--分配的\u波段\u 4:字符串(可空=真) |--分配的\u波

我在读取带有奇怪列的csv文件时遇到了一个问题

模式

根目录
|--Id:integer(nullable=true)
|--Lon_塔:双(可空=真)
|--Lat_塔:双精度(可空=真)
|--Compagny:string(nullable=true)
|--地址:字符串(nullable=true)
|--分配的\u波段\u 1:字符串(可空=真)
|--赋值带2:字符串(可空=真)
|--赋值带3:字符串(可空=真)
|--分配的\u波段\u 4:字符串(可空=真)
|--分配的\u波段\u 5:字符串(可空=真)
|--原始地理代码:字符串(nullable=true)
原始地理代码样本

[{'road':'Calle el-Topo','residential':'Los Sauces','hamlet':'el-Cardal','village':'Los Sauces','city':'San Andrés y Sauces','country':'sant Cruz de Tenerife','archipelago':'Canarias','postcode':'38720','country':'España','country(u code':'es}]
我希望将键作为标题,并使用值填充sparkdataframe,如果此行不存在键,则使用Null。我不想要所有的钥匙,只想要列表中的一些。我删除了[']

一个更好理解的例子:

myList=[“道路”、“旅游”、“国家代码”]
|Id |…|原始地理代码|
|1 |…|{道路:Calle el Topo,群岛:加那利群岛,邮政编码:38720,国家代码:es}
|2 |……|{旅游业:米拉多·蒙塔尼亚·埃尔莫利诺,道路:米拉多·蒙塔尼亚·埃尔莫利诺,村庄:巴洛文托,国家代码:es}
期望的结果

| ID |……|道路|旅游|国家|代码|
|1 |…| Calle el Topo | NULL | es
|2 |…|空|米拉多·蒙塔尼亚·埃尔莫利诺| es

您可以使用
regexp\u extract
提取所需的值:

myList = ['road', 'tourism', 'country_code']

for i in myList:
    df = df.withColumn(
        i, 
        F.when(
            F.regexp_extract('raw_geocode', i+': ([^,}]+)', 1) != "",
            F.regexp_extract('raw_geocode', i+': ([^,}]+)', 1)
        )
    )

df.show(truncate=False)
+---+------------------------------------------------------------------------------------------------------------+-------------------------+-------------------------+------------+
|Id |raw_geocode                                                                                                 |road                     |tourism                  |country_code|
+---+------------------------------------------------------------------------------------------------------------+-------------------------+-------------------------+------------+
|1  |{road: Calle el Topo, archipelago: Canarias, postcode: 38720, country_code: es}                             |Calle el Topo            |null                     |es          |
|2  |{tourism: Mirador Montaña El Molino, road: Mirador Montaña El Molino, village: Barlovento, country_code: es}|Mirador Montaña El Molino|Mirador Montaña El Molino|es          |
+---+------------------------------------------------------------------------------------------------------------+-------------------------+-------------------------+------------+

嗨,谢谢你的快速反应,你让我开心!你能解释一下'i+`吗?它是用来将列表中的列名动态添加到regex模式的。