以下に示すようなスキーマがあります。ネストされたオブジェクトをどのように解析できますか
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)
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();
これを試して:
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
次のようなSQLクエリから直接やってみましたか?
Select apps.element.Ratings from yourTableName
これはおそらく配列を返し、内部の要素により簡単にアクセスできます。また、大規模なJSON構造を処理する必要があり、スキーマが複雑すぎる場合、このオンラインJsonビューアを使用します。 http://jsonviewer.stack.hu/
私は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文字列を使用すると、コードを明らかに短くすることができます。