web-dev-qa-db-ja.com

spark sqlのネストされたJSONオブジェクトを解析する方法は?

以下に示すようなスキーマがあります。ネストされたオブジェクトをどのように解析できますか

root
 |-- apps: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- appName: string (nullable = true)
 |    |    |-- appPackage: string (nullable = true)
 |    |    |-- Ratings: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- date: string (nullable = true)
 |    |    |    |    |-- rating: long (nullable = true)
 |-- id: string (nullable = true)
22
None

Jsonファイルを読み取り、表示しているスキーマを次のように印刷するとします。

DataFrame df = sqlContext.read().json("/path/to/file").toDF();
    df.registerTempTable("df");
    df.printSchema();

次に、次のように構造体タイプ内のネストされたオブジェクトを選択できます...

DataFrame app = df.select("app");
        app.registerTempTable("app");
        app.printSchema();
        app.show();
DataFrame appName = app.select("element.appName");
        appName.registerTempTable("appName");
        appName.printSchema();
        appName.show();
25
Vasilis Vagias

これを試して:

val nameAndAddress = sqlContext.sql("""
    SELECT name, address.city, address.state
    FROM people
""")
nameAndAddress.collect.foreach(println)

ソース: https://databricks.com/blog/2015/02/02/an-introduction-to-json-support-in-spark-sql.html

5
ben jarman

次のようなSQLクエリから直接やってみましたか?

Select apps.element.Ratings from yourTableName

これはおそらく配列を返し、内部の要素により簡単にアクセスできます。また、大規模なJSON構造を処理する必要があり、スキーマが複雑すぎる場合、このオンラインJsonビューアを使用します。 http://jsonviewer.stack.hu/

3
Adelina Balasa

私はpysparkを使用していますが、ロジックは似ているはずです。私はネストされたjsonを解析するこの方法が便利だと感じました:

df.select(df.apps.appName.alias("apps_Name"), \
          df.apps.appPackage.alias("apps_Package"), \
          df.apps.Ratings.date.alias("apps_Ratings_date")) \
   .show()

F文字列を使用すると、コードを明らかに短くすることができます。

1
filip stepniak