带逗号的 PySpark 值不包含逗号?? (尝试转换为 ArrayType(StringType()))

PySpark value with comma doesn't contain comma?? (Trying to cast to ArrayType(StringType()))

我正在 运行ning PySpark v1.6.0,我有一列字符串值(根据 .printSchema),但是当我尝试根据列值以以下开头的情况过滤行时一个“[”字符或包含一个“,”字符,在这两种情况下,它表示我期望评估为 True 的行仍然是 False...

当我运行代码:

col_name = "attempt_params_attempt_response_id"
resultDF.select(col_name, resultDF[col_name].like(",")).show(50)

我得到:

我不明白这是怎么可能的,因为字符串值显然包含逗号,所以该行应该 return 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", "^\[|\]$",  ""), ",")