簡體   English   中英

使用 PySpark 將 JSON 文件讀取為 Pyspark 數據幀?

[英]Read JSON file as Pyspark Dataframe using PySpark?

如何使用 PySpark 讀取以下 JSON 結構以激發數據幀?

我的 JSON 結構

{"results":[{"a":1,"b":2,"c":"name"},{"a":2,"b":5,"c":"foo"}]}

我試過:

df = spark.read.json('simple.json');

我想要輸出 a,b,c 作為列和值作為相應的行。

謝謝。

Json 字符串變量

如果你有json 字符串作為變量,那么你可以做

simple_json = '{"results":[{"a":1,"b":2,"c":"name"},{"a":2,"b":5,"c":"foo"}]}'
rddjson = sc.parallelize([simple_json])
df = sqlContext.read.json(rddjson)

from pyspark.sql import functions as F
df.select(F.explode(df.results).alias('results')).select('results.*').show(truncate=False)

這會給你

+---+---+----+
|a  |b  |c   |
+---+---+----+
|1  |2  |name|
|2  |5  |foo |
+---+---+----+

Json 字符串作為文件中的單獨行(sparkContext 和 sqlContext)

如果您在文件中將 json 字符串作為單獨的行,那么您可以使用 sparkContext 將其讀取到 rdd[string]如上所述,其余過程與上述相同

rddjson = sc.textFile('/home/anahcolus/IdeaProjects/pythonSpark/test.csv')
df = sqlContext.read.json(rddjson)
df.select(F.explode(df['results']).alias('results')).select('results.*').show(truncate=False)

Json 字符串作為文件中的單獨行(僅限 sqlContext)

如果您在文件中將 json 字符串作為單獨的行,那么您只能使用sqlContext 但是這個過程很復雜,因為你必須為它創建模式

df = sqlContext.read.text('path to the file')

from pyspark.sql import functions as F
from pyspark.sql import types as T
df = df.select(F.from_json(df.value, T.StructType([T.StructField('results', T.ArrayType(T.StructType([T.StructField('a', T.IntegerType()), T.StructField('b', T.IntegerType()), T.StructField('c', T.StringType())])))])).alias('results'))
df.select(F.explode(df['results.results']).alias('results')).select('results.*').show(truncate=False)

這應該給你與上面相同的結果

我希望答案有幫助

!pip install findspark
!pip install pyspark
import findspark
import pyspark
findspark.init()
sc = pyspark.SparkContext.getOrCreate()
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('abc').getOrCreate()

讓我們生成我們自己的 JSON 數據這樣我們還不必訪問文件系統。

stringJSONRDD = sc.parallelize((""" 
  { "id": "123",
    "name": "Katie",
    "age": 19,
    "eyeColor": "brown"
  }""",
   """{
    "id": "234",
    "name": "Michael",
    "age": 22,
    "eyeColor": "green"
  }""", 
  """{
    "id": "345",
    "name": "Simone",
    "age": 23,
    "eyeColor": "blue"
  }""")
)

然后創建數據幀

swimmersJSON = spark.read.json(stringJSONRDD)

創建臨時表

swimmersJSON.createOrReplaceTempView("swimmersJSON")

希望這對你有幫助。 有關完整代碼,您可以參考此GitHub 存儲庫

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql.functions import explode

spark = SparkSession.builder.getOrCreate()
sc = spark.sparkContext
json_data = '{"results":[{"a":1,"b":2,"c":"name"},{"a":2,"b":5,"c":"foo"}]}'
json_rdd = sc.parallelize([json_data])
df = spark.read.json(json_rdd)
df =df.withColumn("results", explode(df.results)).select( 
                         col("results.a").alias("a"),
                         col("results.b").alias("b"),
                         col("results.c").alias("c") ) 
df.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM