python - 如何在pyspark中使用分隔符拆分列表
问题描述
我正在尝试使用分隔符“,”拆分列表,但在列表元素内还有字符“,”,例如:
1|[this is first element, this is seconde element, this is (bad, element)]
我想玩数据名,但是第三个元素中的这个逗号破坏了逻辑
current output :
id |name |val
1 |Column0|this is first element
1 |Column2|this is seconde element
1 |Column3|this is (bad
1 |Column4|element)
expected output:
id |name |val
1 |Column0|this is first element
1 |Column1|this is seconde element
1 |Column2|this is (bad, element)
df = df.select("id",f.split("text", ",").alias("text"),f.posexplode_outer(f.split("text", ",")).alias("pos", "val")).drop("val") \ .select("id","text",f.concat(f.lit("Column"),f.col("pos").cast("string")).alias("name"),f.expr("text[pos]").alias("val"))
解决方案
您需要找到正确的模式以在两者之间split
忽略,
()
您可以使用这个基于负前瞻的正则表达式:
,\s*(?![^()]*\))
此正则表达式正在查找带有断言的逗号,该断言确保逗号不在括号中。这是使用负前瞻来完成的,它首先消耗所有匹配(
,)
然后是)
. 这假设括号是平衡的和未转义的。
# Create data frame
df = spark.createDataFrame(
[(1, "this is first element, this is seconde element, this is (bad, element)")],
("id", "text"))
# import functions
from pyspark.sql import functions as f
# apply transformation
df1 = df.select("id",f.split("text", ",\s*(?![^()]*\))").alias("text"),f.posexplode_outer(f.split("text", ",\s*(?![^()]*\))")).alias("pos", "val")).drop("val").select("id","text",f.concat(f.lit("Column"),f.col("pos").cast("string")).alias("name"),f.expr("text[pos]").alias("val"))
在下面的链接中传递你的字符串,它会给你结果
推荐阅读
- azure-webjobs - Azure Web 作业未触发并始终给出“未找到作业功能”
- javafx - JavaFX 如何更改 Spinner 中箭头的颜色?
- ios - 将 PDF 图像添加到 UIBarItem Swift
- javascript - JQuery 移动面板小部件 – 打开可折叠列表会导致跳转滚动到页面 div 的底部,一旦扩展超出页面高度。为什么?
- shell - 为什么 ExecShell 忽略我的显示类型参数?
- reactjs - 与 webpack 捆绑后的电子远程错误
- android - 在 Android 中扩展音量面板
- php - Laravel API 路由不进行限制 - 始终设置为默认值 60,1
- javascript - 如何在 WheelPicker(React Native JS)上刚刚选择的项目之前添加字符串
- javascript - tensorflow.js model.predict() 打印张量 [[NaN],]