如何将 JSON 格式的单行 Spark 数据框分解为多行?
How to explode a one row Spark dataframe in JSON format to multiple rows?
上下文:我正在学习 PySpark,我正在尝试 运行 对推文进行情绪分析。加载数据(即 JSON 格式)后,我想将其存储在 Spark Dataframe 中进行预处理(删除不必要的 symbols/words)。目前,我正在使用一个我想消除的中间步骤:我正在将 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"}
我怎样才能有效地将它变成一个“普通”数据框,每个单词一行?
谢谢
如果 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|
+--------+
上下文:我正在学习 PySpark,我正在尝试 运行 对推文进行情绪分析。加载数据(即 JSON 格式)后,我想将其存储在 Spark Dataframe 中进行预处理(删除不必要的 symbols/words)。目前,我正在使用一个我想消除的中间步骤:我正在将 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"}
我怎样才能有效地将它变成一个“普通”数据框,每个单词一行?
谢谢
如果 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|
+--------+