在PySpark中爆炸

发布于 2021-01-29 15:05:59

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

如何在DataFrame中的列上爆炸?

这是我尝试的一些示例,您可以在其中取消注释每个代码行并获取以下注释中列出的错误。我在带有Spark 1.6.1的Python 2.7中使用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()

请指教

关注者
0
被浏览
60
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    explodesplit是SQL函数。两者都在SQL上运行Columnsplit将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|
    ## +--------+
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看