【问题标题】:Explode in PySpark在 PySpark 中爆炸
【发布时间】:2016-11-07 16:59:54
【问题描述】:

我想从包含单词列表的 DataFrame 转换为每个单词在其自己的行中的 DataFrame。

如何在 DataFrame 中的列上展开?

这是一个示例,其中包含我的一些尝试,您可以取消注释每个代码行并获取以下注释中列出的错误。我在 Python 2.7 和 Spark 1.6.1 中使用 PySpark。

from pyspark.sql.functions import split, explode
DF = sqlContext.createDataFrame([('cat \n\n elephant rat \n rat cat', )], ['word'])
print 'Dataset:'
DF.show()
print '\n\n Trying to do explode: \n'
DFsplit_explode = (
 DF
 .select(split(DF['word'], ' '))
#  .select(explode(DF['word']))  # AnalysisException: u"cannot resolve 'explode(word)' due to data type mismatch: input to function explode should be array or map type, not StringType;"
#   .map(explode)  # AttributeError: 'PipelinedRDD' object has no attribute 'show'
#   .explode()  # AttributeError: 'DataFrame' object has no attribute 'explode'
).show()

# Trying without split
print '\n\n Only explode: \n'

DFsplit_explode = (
 DF 
 .select(explode(DF['word']))  # AnalysisException: u"cannot resolve 'explode(word)' due to data type mismatch: input to function explode should be array or map type, not StringType;"
).show()

请指教

【问题讨论】:

  • 更正 - 建议*

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


【解决方案1】:

explodesplit 是 SQL 函数。两者都在 SQL Column 上运行。 split 将 Java 正则表达式作为第二个参数。如果你想在任意空格上分隔数据,你需要这样的东西:

df = sqlContext.createDataFrame(
    [('cat \n\n elephant rat \n rat cat', )], ['word']
)

df.select(explode(split(col("word"), "\s+")).alias("word")).show()

## +--------+
## |    word|
## +--------+
## |     cat|
## |elephant|
## |     rat|
## |     rat|
## |     cat|
## +--------+

【讨论】:

    【解决方案2】:

    要拆分空格并删除空白行,请添加where 子句。

    DF = sqlContext.createDataFrame([('cat \n\n elephant rat \n rat cat\nmat\n', )], ['word'])
    
    >>> (DF.select(explode(split(DF.word, "\s")).alias("word"))
           .where('word != ""')
           .show())
    
    +--------+
    |    word|
    +--------+
    |     cat|
    |elephant|
    |     rat|
    |     rat|
    |     cat|
    |     mat|
    +--------+
    

    【讨论】:

    • 感谢您添加的 where 子句。
    • 对于一个稍微更完整的解决方案,它可以推广到必须报告多列的情况,使用'withColumn'而不是简单的'select',即:df.withColumn('word',explode ('word')).show() 这保证了 DataFrame 中的所有其余列在使用 explode 后仍然存在于输出 DataFrame 中。这也比指定需要选择的每一列更简单,即:df.select('col1','col2',...,'colN', explode('word')).show()
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2021-11-09
    • 2018-11-13
    • 2021-09-19
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多