Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 更改嵌套JSON属性的类型_Scala_Apache Spark_Spark Dataframe - Fatal编程技术网

Scala 更改嵌套JSON属性的类型

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"

我试图更改数据帧列中嵌套JSON属性的类型。嵌套属性中的更改已被视为新列,这将导致重复列。对于顶级属性(Timestamp),这种更改可以正常工作,但对于嵌套属性(a.b.c)则不行。对这个问题有什么想法吗?

因为您的列是struct类型&您需要在相同的层次结构中再次构建它。因为它不是假设,它认为你在重写结构。 输入:

这是以下两种模式之前和之后的输出:

{"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)