Pyspark SQL 不拆分列

问题描述 投票:0回答:1

我试图根据存储在另一列中的值使用 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'))
这可能吗?

python apache-spark pyspark split
1个回答
1
投票

您可以在

'\\'
字段前面添加转义字符
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]|
+-------------------+---------+----------------------+
© www.soinside.com 2019 - 2024. All rights reserved.