Scala 更改嵌套JSON属性的类型
我试图更改数据帧列中嵌套JSON属性的类型。嵌套属性中的更改已被视为新列,这将导致重复列。对于顶级属性(Timestamp),这种更改可以正常工作,但对于嵌套属性(a.b.c)则不行。对这个问题有什么想法吗?因为您的列是struct类型&您需要在相同的层次结构中再次构建它。因为它不是假设,它认为你在重写结构。 输入: 这是以下两种模式之前和之后的输出:Scala 更改嵌套JSON属性的类型,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我试图更改数据帧列中嵌套JSON属性的类型。嵌套属性中的更改已被视为新列,这将导致重复列。对于顶级属性(Timestamp),这种更改可以正常工作,但对于嵌套属性(a.b.c)则不行。对这个问题有什么想法吗?因为您的列是struct类型&您需要在相同的层次结构中再次构建它。因为它不是假设,它认为你在重写结构。 输入: 这是以下两种模式之前和之后的输出: {"a": {"b": {"c": "1.31", "d": "1.11"}}, "TimeStamp": "2017-02-18", "id"
{"a": {"b": {"c": "1.31", "d": "1.11"}}, "TimeStamp": "2017-02-18", "id":1}
{"a": {"b": {"c": "2.31", "d": "2.22"}}, "TimeStamp": "2017-02-18", "id":1}
val lines2 = spark.read.json("/home/kiran/km/km_hadoop/data/data_nested_struct_col2.json")
lines2.printSchema()
val df2 = lines2.withColumn("a", struct(
struct(
lines2("a.b.c").cast(DoubleType).as("c"),
lines2("a.b.d").as("d")
).as("b")))
.withColumn("TimeStamp", lines2("TimeStamp").cast(DateType))
df2.printSchema()
我希望这是清楚的。我尝试使用相同的层次结构为a->b->c构建。它起作用了。但是,这似乎只有在树的同一级别上有一个属性时才起作用。如果我们有两个属性,比如a->b->c和a->b->d,那么a->b->d将被删除,并且在a->b->c施放后,只有a->b->c存在。所以这可能不起作用。您忽略了一件事,这个解决方案基于一个限制(至少据我所知),即无法通过在Dataframe的withColumn()函数中使用点符号来调用内部列。它接受要处理的列名的简单字符串。因此,您需要维护相同的结构,这是不可伸缩的。。如果原始结构不同,代码也会更改。我将添加修改后的代码作为新答案,因为注释部分不允许格式化。。。
{"a": {"b": {"c": "1.31", "d": "1.11"}}, "TimeStamp": "2017-02-18", "id":1}
{"a": {"b": {"c": "2.31", "d": "2.22"}}, "TimeStamp": "2017-02-18", "id":1}
val lines2 = spark.read.json("/home/kiran/km/km_hadoop/data/data_nested_struct_col2.json")
lines2.printSchema()
val df2 = lines2.withColumn("a", struct(
struct(
lines2("a.b.c").cast(DoubleType).as("c"),
lines2("a.b.d").as("d")
).as("b")))
.withColumn("TimeStamp", lines2("TimeStamp").cast(DateType))
df2.printSchema()
root
|-- TimeStamp: string (nullable = true)
|-- a: struct (nullable = true)
| |-- b: struct (nullable = true)
| | |-- c: string (nullable = true)
| | |-- d: string (nullable = true)
|-- id: long (nullable = true)
root
|-- TimeStamp: date (nullable = true)
|-- a: struct (nullable = false)
| |-- b: struct (nullable = false)
| | |-- c: double (nullable = true)
| | |-- d: string (nullable = true)
|-- id: long (nullable = true)