首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带逗号的PySpark值不包含逗号??(尝试强制转换为ArrayType(StringType()

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

Stack Overflow用户
提问于 2018-09-04 08:00:48
回答 1查看 263关注 0票数 1

我正在运行PySpark v1.6.0,我有一列字符串值(根据.printSchema),但是当我尝试根据列值以"[“字符开头或包含",”字符的情况来筛选行时,在这两种情况下,它都表示我希望计算为True的行仍然是False...

当我运行代码时:

代码语言:javascript
复制
col_name = "attempt_params_attempt_response_id"
resultDF.select(col_name, resultDF[col_name].like(",")).show(50)

我得到了:

我不明白这是怎么回事,因为字符串值显然包含一个逗号,所以该行应该返回true,而不是false

类似地,当我尝试将行转换为ArrayType(StringType()) (这是我的最终目标)时,它的行为也就像我的行不包含逗号一样……

当我运行代码时:

代码语言:javascript
复制
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)

我得到的结果是:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-04 08:21:59

在这种情况下你的模式是错误的。like等同于SQL,就像使用简单的正则表达式一样,所以,只匹配文字,

代码语言:javascript
复制
df = spark.createDataFrame([("[0,2,3]", ), (",", )], ("text", ))
df.withColumn("contains_comma", col("text").like(",")).show()
代码语言:javascript
复制
+-------+--------------+
|   text|contains_comma|
+-------+--------------+
|[0,2,3]|         false|
|      ,|          true|
+-------+--------------+

要获得匹配,您应该添加前导和尾随通配符:

代码语言:javascript
复制
df.withColumn("contains_comma", col("text").like("%,%")).show()


# +-------+--------------+
# |   text|contains_comma|
# +-------+--------------+
# |[0,2,3]|          true|
# |      ,|          true|
# +-------+--------------+

在第二种情况下,根本没有问题。由于您在,上拆分,因此第一个项目将包含前导[

代码语言:javascript
复制
df.withColumn("contains_comma", split("text", ",\s*")[0]).show()
代码语言:javascript
复制
+-------+--------------+
|   text|contains_comma|
+-------+--------------+
|[0,2,3]|            [0|
|      ,|              |
+-------+--------------+

最后一个尾随的]。如果不希望它们出现在输出中,则应对其进行剥离,例如使用regexp_replace

代码语言:javascript
复制
split(regexp_replace("text", "^\[|\]$",  ""), ",")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52157239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档