我正在运行PySpark v1.6.0,我有一列字符串值(根据.printSchema),但是当我尝试根据列值以“[”字符开头或包含“,”的情况过滤行时, “在这两种情况下,它都说,我期望评估为True的行仍然是假的......
当我运行代码时:
col_name = "attempt_params_attempt_response_id"
resultDF.select(col_name, resultDF[col_name].like(",")).show(50)
我明白了:
我不明白这是怎么可能的,因为字符串值显然包含一个逗号,所以该行应该返回true
,而不是false
。
类似地,当我尝试将行转换为ArrayType(StringType())
(这是我的最终目标)时,它的行为就好像我的行不包含逗号...
当我运行代码时:
from pyspark.sql.types import ArrayType, IntegerType, StringType
col_name = "attempt_params_attempt_response_id"
resultDF.withColumn(col_name,
split(resultDF[col_name], ",\s*")
.cast(ArrayType(StringType()))).select(col_name).show(40)
我得到了结果:
我想知道是否有某种奇怪的编码问题导致字符,
与数据中看起来像,
字符的字符不匹配......但我真的不确定。关于为什么会发生这种情况的任何想法以及如何在不创建多维数组文本的情况下实际使投射工作?
如果你的模式是错误的。 like
等同于使用简单正则表达式的SQL,因此,
只匹配文字,
。
df = spark.createDataFrame([("[0,2,3]", ), (",", )], ("text", ))
df.withColumn("contains_comma", col("text").like(",")).show()
+-------+--------------+
| text|contains_comma|
+-------+--------------+
|[0,2,3]| false|
| ,| true|
+-------+--------------+
要获得匹配,您应该添加前导和尾随通配符:
df.withColumn("contains_comma", col("text").like("%,%")).show()
# +-------+--------------+
# | text|contains_comma|
# +-------+--------------+
# |[0,2,3]| true|
# | ,| true|
# +-------+--------------+
在第二种情况下,根本没有问题。由于你在,
上拆分,第一项将包含一个领先的[
df.withColumn("contains_comma", split("text", ",\s*")[0]).show()
+-------+--------------+
| text|contains_comma|
+-------+--------------+
|[0,2,3]| [0|
| ,| |
+-------+--------------+
和最后一个尾随]
。如果你不想在输出中使用它们,你应该删除它们,例如使用regexp_replace
:
split(regexp_replace("text", "^\[|\]$", ""), ",")