У меня есть такие данные в формате JSON:
{
"data": [
{
"id": "4619623",
"team": "452144",
"created_on": "2018-10-09 02:55:51",
"links": {
"edit": "https://some_page",
"publish": "https://some_publish",
"default": "https://some_default"
}
},
{
"id": "4619600",
"team": "452144",
"created_on": "2018-10-09 02:42:25",
"links": {
"edit": "https://some_page",
"publish": "https://some_publish",
"default": "https://some_default"
}
}
}
Я читаю эти данные с помощью Apache spark и хочу записать их разделение по столбцу id.Когда я использую это: df.write.partitionBy("data.id").json(<path_to_folder>)
Я получу ошибку:
Exception in thread "main" org.apache.spark.sql.AnalysisException: Partition column data.id not found in schema
Я также попытался использовать функцию разнесения следующим образом:
import org.apache.spark.sql.functions.{col, explode}
val renamedDf= df.withColumn("id", explode(col("data.id")))
renamedDf.write.partitionBy("id").json(<path_to_folder>)
Это действительно помогло, но каждая папка раздела id содержала один и тот же исходный файл JSON.
EDIT: схема df DataFrame:
|-- data: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- created_on: string (nullable = true)
| | |-- id: string (nullable = true)
| | |-- links: struct (nullable = true)
| | | |-- default: string (nullable = true)
| | | |-- edit: string (nullable = true)
| | | |-- publish: string (nullable = true)
Схема переименованногоDF DataFrame:
|-- data: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- created_on: string (nullable = true)
| | |-- id: string (nullable = true)
| | |-- links: struct (nullable = true)
| | | |-- default: string (nullable = true)
| | | |-- edit: string (nullable = true)
| | | |-- publish: string (nullable = true)
|-- id: string (nullable = true)
Я использую spark 2.1.0
Я нашел это решение: Разделение DataFrameBy на вложенных столбцах
И этот пример: http://bigdatums.net/2016/02/12/how-to-extract-nested-json-data-in-spark/
Но все это не помогло мне решить мою проблему.
Спасибо в andvance за любую помощь.