Spark как таковая не поддерживает переименование отдельных вложенных полей. Вы должны либо создать, либо перестроить целую структуру. Для простоты предположим, что данные выглядят следующим образом:
cat('{"contributors": "foo", "coordinates": "bar", "entities": {"hashtags": ["foo", "bar"], "media": "missing"}}', file = "/tmp/example.json")
df <- spark_read_json(sc, "df", "/tmp/example.json", overwrite=TRUE)
df %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
root
|-- contributors: string (nullable = true)
|-- coordinates: string (nullable = true)
|-- entities: struct (nullable = true)
| |-- hashtags: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- media: string (nullable = true)
с простым строковым представлением:
df %>%
spark_dataframe() %>%
invoke("schema") %>%
invoke("simpleString") %>%
cat(sep = "\n")
struct<contributors:string,coordinates:string,entities:struct<hashtags:array<string>,media:string>>
С помощью cast вы должны определить выражение, используя описание соответствующего типа:
expr_cast <- invoke_static(
sc, "org.apache.spark.sql.functions", "expr",
"CAST(entities AS struct<e_hashtags:array<string>,media:string>)"
)
df_cast <- df %>%
spark_dataframe() %>%
invoke("withColumn", "entities", expr_cast) %>%
sdf_register()
df_cast %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
root
|-- contributors: string (nullable = true)
|-- coordinates: string (nullable = true)
|-- entities: struct (nullable = true)
| |-- e_hashtags: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- media: string (nullable = true)
Чтобы перестроить структуру, вы должны сопоставить все компоненты:
expr_struct <- invoke_static(
sc, "org.apache.spark.sql.functions", "expr",
"struct(entities.hashtags AS e_hashtags, entities.media)"
)
df_struct <- df %>%
spark_dataframe() %>%
invoke("withColumn", "entities", expr_struct) %>%
sdf_register()
df_struct %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
root
|-- contributors: string (nullable = true)
|-- coordinates: string (nullable = true)
|-- entities: struct (nullable = false)
| |-- e_hashtags: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- media: string (nullable = true)