У меня есть файл json с этой структурой
root
|-- labels: struct (nullable = true)
| |-- compute.googleapis.com/resource_name: string (nullable = true)
| |-- container.googleapis.com/namespace_name: string (nullable = true)
| |-- container.googleapis.com/pod_name: string (nullable = true)
| |-- container.googleapis.com/stream: string (nullable = true)
Я хочу извлечь четыре .....googleapis.com/...
в четыре столбца.
Я пробовал это:
import org.apache.spark.sql.functions._
df = df.withColumn("resource_name", df("labels.compute.googleapis.com/resource_name"))
.withColumn("namespace_name", df("labels.compute.googleapis.com/namespace_name"))
.withColumn("pod_name", df("labels.compute.googleapis.com/pod_name"))
.withColumn("stream", df("labels.compute.googleapis.com/stream"))
Я также попытался сделать это, сделав labels
массив, который решил первую ошибку, в которой говорится, что подуровни не являются array
или map
df2 = df.withColumn("labels", explode(array(col("labels"))))
.select(col("labels.compute.googleapis.com/resource_name").as("resource_name"), col("labels.compute.googleapis.com/namespace_name").as("namespace_name"), col("labels.compute.googleapis.com/pod_name").as("pod_name"), col("labels.compute.googleapis.com/stream").as("stream"))
Я все еще получаю эту ошибку
org.apache.spark.sql.AnalysisException: No such struct field compute in compute.googleapis.com/resource_name .....
Я знаю, Spark
считает, что каждая точка является вложенным уровнем, но как я могу отформатировать compute.googleapis.com/resource_name
, который spark
распознает как имя уровня, а не многоуровневый.
Я также пытался решить, как указано здесь
Как заставить Apache искру игнорировать точки в запросе?
Но это также не решило мою проблему.У меня есть label.compute.googleapis.com/resource_name, добавление обратных галочек к compute.googleapis.com/resource_name по-прежнему выдает ту же ошибку.