pyspark从逗号分隔值列表中创建多个行

时间:2018-05-22 02:05:36

标签: pyspark tweets

在pyspark sqlcontext sql中,编写了代码来获取文本,然后重新格式化 但是像这样的问题是

在数据框中有这样的东西 代码就像

hash_tags_fun = udf(lambda t: re.findall('(#[^#]\w{3,})', t))

hash_tags_in_tweets_df.registerTempTable("hash_tags_table")
hash_tags_result = sqlContext.sql("SELECT text FROM hash_tags_table")
hash_tags_list = hash_tags_result.withColumn('text', hash_tags_fun('text'))
hash_tags_list.show(3)
+-------------------+
|               text|
+-------------------+
|  [#shutUpAndDANCE]|
|  [#SHINee, #AMBER]|
|[#JR50, #flipagram]|
+-------------------+

我需要像

这样的东西
+-------------------+
|               text|
+-------------------+
|    #shutUpAndDANCE|
|            #SHINee|
|             #AMBER|
|              #JR50|
|         #flipagram|
+-------------------+
hash_tags_list.withColumn("text", explode("text")) has given an error saying
  

AnalysisException:u"无法解决'爆炸(text)'由于数据类型   不匹配:函数爆炸的输入应该是数组或地图类型,而不是   串;; \ n'项目[爆炸(文本#24)AS文本#68] \ n + -   AnalysisBarrier \ n
  + - 项目[(文本#9)AS文本#24] \ n
  + - 项目[文本#9] \ n
  + - SubqueryAlias hash_tags_table \ n
  + - 项目[文本#9] \ n
  + - 过滤文本#9 LIKE%#%\ n
  + - SubqueryAlias twt \ n
  + - SubqueryAlias推文\ n
  + - 关系[country#6,id#7,place#8,text#9,user#10] json \ n"

1 个答案:

答案 0 :(得分:0)

扩展my comment

您的列看起来像一个数组,但它实际上是一个字符串 - 这就是您对explode()的调用不起作用的原因。您必须先将列转换为数组。

这将涉及删除前导和尾随方括号并在逗号字符上拆分。

首先删除前导括号和尾随括号,您可以使用pyspark.sql.functions.regexp_replace()

from pyspark.sql.functions import regexp_replace, split
df = hash_tags_list.select(regexp_replace("text", r"(^\[)|(\]$)", "").alias("text"))
df.show()
#+-----------------+
#|             text|
#+-----------------+
#|  #shutUpAndDANCE|
#|  #SHINee, #AMBER|
#|#JR50, #flipagram|
#+-----------------+

现在拆分逗号后跟空格:

df = df.select(split("text", ", ").alias("text"))
df.show()
#+-------------------+
#|               text|
#+-------------------+
#|  [#shutUpAndDANCE]|
#|  [#SHINee, #AMBER]|
#|[#JR50, #flipagram]|
#+-------------------+

你会注意到这个打印与你开始的完全一样,但是当我们检查架构时,我们发现它们实际上是字符串数组:

df.printSchema()
#root
# |-- text: array (nullable = true)
# |    |-- element: string (containsNull = true)

将其与原始DataFrame的架构进行比较:

hash_tags_list.printSchema()
#root
# |-- text: string (nullable = true)

将数据作为数组,现在可以调用explode()

from pyspark.sql.functions import explode
df = df.select(explode("text").alias("hashtags"))
df.show()
#+---------------+
#|       hashtags|
#+---------------+
#|#shutUpAndDANCE|
#|        #SHINee|
#|         #AMBER|
#|          #JR50|
#|     #flipagram|
#+---------------+