Я пытался разделить свой столбец с помощью 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(col('a'),col('b'))
возможно ли это?
Вы можете добавить escape-символ '\\'
перед полем 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]|
+-------------------+---------+----------------------+
Вопрос меня немного сбивает с толку. Не могли бы вы также поделиться, каким должен быть желаемый результат?