

pysparkを使用しています。Spark 2.1以降であれば、スキーマ定義を行った後にJsonファイルを読み込むことができます。

* * *

例1  
test01.json

[code]

    {
     "_id":"2d3erf5",
     "testNo":"0001",
     "Date":"2017-09-01 00:00:00.00000"
    }
    
[/code]

test01.py

[code]

    from pyspark.sql import SparkSession
    from pyspark.sql.types import *
    
    spark = SparkSession.builder.appName('Spark SQL and DataFrame').getOrCreate()
    
    
    testColumn = StructType([
      StructField('_id', StringType(), False),
      StructField('testNo', IntegerType(), False),
      StructField('Date', TimestampType(), False)
    ])
    readFile = '/tmp/test01.json'
    test_df = spark.read.json(readFile, schema=testColumn)
    
[/code]

* * *

今回、ネストされているJsonファイルを読み込む必要があるのですが、どう記述すればよろしいのでしょうか？

* * *

例2  
test02.json

[code]

    {
      "_id":"2d3erf5",
      "testNo":"0001",
      "test_date"{
                  "date_1":"2017-09-01 00:00:00.00000",
                  "date_2":"2017-09-05 03:00:00.00000"
                 }
    }
    
[/code]

以下のような感じに記述するのかなとは、思っていますが、どなたかご教授願います。

test02.py

[code]

    from pyspark.sql import SparkSession
    from pyspark.sql.types import *
    
    spark = SparkSession.builder.appName('Spark SQL and DataFrame').getOrCreate() 
    
    
    testColumn = StructType([
      StructField('_id', StringType(), False),
      StructField('testNo', IntegerType(), False),
      StructField('test_date.date_1', TimestampType(), False),
      StructField('test_date.date_2', TimestampType(), False),
    ])
    readFile = '/tmp/test02.json'
    test_df = spark.read.json(readFile, schema=testColumn)
    
[/code]


CC BY-SA 3.0
2017-09-08T08:09:38.563
37805
2018-10-24T14:01:11.687
25283
question
json python3 spark
Spark DataFrameに ネストしたJsonファイルからデータを読み込みたい


ネストしたスキーマは次のように定義します

[code]

    testColumn = StructType([
      StructField('_id', StringType(), False),
      StructField('testNo', IntegerType(), False),
      StructField('test_date',
                  StructType([
                      StructField('date_1', TimestampType(), False),
                      StructField('date_2', TimestampType(), False)
                  ]), False)
    ])
    
[/code]

selectを使って特定のフィールドだけ選択します。

[code]

    test_df = spark.read.json(readFile, schema=testColumn)
    x = test_df.select('_id', 'test_date.date_1')
    x.show()
    
[/code]


CC BY-SA 3.0
2017-09-08T21:32:50.580
37821
2017-09-08T21:32:50.580
7837
37805
answer