Dataframe PySpark,如何解析格式为dict的字符串并将一些键附加为新列
我在读取带有奇怪列的csv文件时遇到了一个问题 模式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波
根目录
|--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模式的。