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

时间:2018-09-04 00:00:48

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

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

当我运行代码时:

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

我得到:

Picture where column value should be true but is false

我不知道怎么可能,因为字符串值显然包含逗号,因此该行应返回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)

我得到结果:

Multidimensional array as if there was no comma to split on

我想知道是否存在某种奇怪的编码问题,导致字符,与数据中似乎是,字符的字符不匹配...但是我确实是不确定。关于为什么会发生这种情况以及如何在不创建多维数组文本的情况下如何真正进行强制转换的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您的模式是错误的。 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", "^\[|\]$",  ""), ",")