背景:我正在學習 PySpark,我正在嘗試對推文進行情緒分析。加載資料(即 JSON 格式)后,我想將其存盤在 Spark Dataframe 中進行預處理(洗掉不必要的符號/單詞)。目前,我正在使用我想要消除的中間步驟:我將 JSON 加載到 Pandas DataFrame 中,然后加載到 spark Dataframe 中,并且一切正常。
但是,將 JSON 直接加載到 PySpark DataFrame 時,所有資料僅存盤在一行中。
我如何加載資料:
df = spark.read.json("dbfs:/FileStore/tables/json_twitter.json").select("full_text")
df 僅由一行和一列(full_text)構成,格式如下:
{"0": "Hello", "1": "Tweet","2": "Bye"}
我怎樣才能有效地把它變成一個“正常”的資料幀,每個單詞都有一行?
謝謝
uj5u.com熱心網友回復:
如果里面的值fulltext是一個字串,您可以首先使用from_json示例將其轉換為地圖型別
from pyspark.sql import functions as F
from pyspark.sql import types as T
df = df.withColumn("fulltext",F.from_json("fulltext",T.MapType(T.StringType(),T.StringType())))
在應用explode函式將值拆分為多行之前,例如:
from pyspark.sql import functions as F
from pyspark.sql import types as T
df = df.select(F.explode("fulltext"))
df.show(truncate=False)
--- -----
|key|value|
--- -----
|0 |Hello|
|1 |Tweet|
|2 |Bye |
--- -----
編輯 1
如果里面的值fulltext是一個結構體,你可以先
- 使用
cast - 使用替換額外的字符大括號
regexp_replace - 使用逗號分隔字串
split - 使用分解值來獲得所需的行
explode
例如
from pyspark.sql import functions as F
from pyspark.sql import types as T
df = df.withColumn("fulltext",F.col("fulltext").cast("string"))
df.printSchema() # only for debugging purposes
df.show() # only for debugging purposes
df = df.withColumn("fulltext",F.explode(F.split(F.regexp_replace("fulltext","\\{|\\}",""),",")))
df.show() # only for debugging purposes
root
|-- fulltext: string (nullable = false)
-------------------
| fulltext|
-------------------
|{Hello, Tweet, Bye}|
-------------------
--------
|fulltext|
--------
| Hello|
| Tweet|
| Bye|
--------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370298.html
