我试图根据存储在另一列中的值使用 pyspark sql 拆分我的列,但它似乎不适用于某些特殊字符。
这是我的代码:
df = spark.createDataFrame([("50000.0#0#0#", "#"),
("[email protected]@", "@"),
("1$", "$"),
("1000.00^Test_string", "^")],["VALUES", "Delimiter"])
df.registerTempTable("cleanTable")
df2 = spark.sql("""
SELECT
VALUES, cast(Delimiter as string),
split(cast(VALUES as string), cast(Delimiter as string)) as split_values
FROM cleanTable
""")
这是我的结果:
+-------------------+---------+---------------------+
|VALUES |Delimiter|split_values |
+-------------------+---------+---------------------+
|50000.0#0#0# |# |[50000.0, 0, 0, ] |
|[email protected]@ |@ |[0, 1000.0, ] |
|1$ |$ |[1$, ] |
|1000.00^Test_string|^ |[1000.00^Test_string]|
+-------------------+---------+---------------------+
我不明白为什么这不适用于像
$
和^
这样的分隔符,是否需要添加任何额外的配置才能使其正常工作?
此外,它使用 pyspark sql 工作,如何使用 split 函数以列作为参数进行拆分?我的意思是
split(col('a'),col('b'))
这可能吗?
您可以在
'\\'
字段前面添加转义字符 Delimiter
。例如:
df = df.withColumn(
'DelimiterEscaped',
F.concat(F.lit('\\'), F.col('Delimiter'))
)
df.createOrReplaceTempView("cleanTable")
+-------------------+---------+----------------+
| VALUES|Delimiter|DelimiterEscaped|
+-------------------+---------+----------------+
| 50000.0#0#0#| #| \#|
| [email protected]@| @| \@|
| 1$| $| \$|
|1000.00^Test_string| ^| \^|
+-------------------+---------+----------------+
然后当你创建
df2
时,你应该得到正确的结果:
df2 = spark.sql("""
SELECT
VALUES, cast(Delimiter as string),
split(cast(VALUES as string), cast(DelimiterEscaped as string)) as split_values
FROM cleanTable
""")
+-------------------+---------+----------------------+
|VALUES |Delimiter|split_values |
+-------------------+---------+----------------------+
|50000.0#0#0# |# |[50000.0, 0, 0, ] |
|[email protected]@ |@ |[0, 1000.0, ] |
|1$ |$ |[1, ] |
|1000.00^Test_string|^ |[1000.00, Test_string]|
+-------------------+---------+----------------------+