1
scala> val df = spark.read.json("data.json")
scala> df.printSchema
root
|-- a: struct (nullable = true)
| |-- b: struct (nullable = true)
| | |-- c: long (nullable = true)
|-- **TimeStamp: string (nullable = true)**
|-- id: string (nullable = true)
scala> val df1 = df.withColumn("TimeStamp", $"TimeStamp".cast(TimestampType))
scala> df1.printSchema
root
|-- a: struct (nullable = true)
| |-- b: struct (nullable = true)
| | |-- c: long (nullable = true)
|-- **TimeStamp: timestamp (nullable = true)** // WORKING AS EXPECTED
|-- id: string (nullable = true)
scala> val df2 = df.withColumn("a.b.c", $"a.b.c".cast(DoubleType))
scala> df2.printSchema
root
|-- a: struct (nullable = true)
| |-- b: struct (nullable = true)
| | |-- c: long (nullable = true)
|-- TimeStamp: string (nullable = true)
|-- id: string (nullable = true)
|-- **a.b.c: double (nullable = true)** // DUPLICATE COLUMN ADDED
データフレームの列内にネストされたJSON属性のタイプを変更しようとしています。ネストされた属性の変更は新しい列として扱われ、重複する列が作成されます。変更はトップレベルの属性(タイムスタンプ)では正しく動作していますが、ネストされたもの(a.b.c)では正しく動作していません。この問題に関する考えは?ネストされたJSON属性のタイプを変更する
あなたのコードは何ですか? – KiranM
私はa - > b - > cのために同じ階層を使って構築しようとしました。できます。しかし、これは、ツリー内の同じレベルに1つの属性がある場合にのみ機能するようです。 a - > b - > cとa - > b - > dの2つの属性がある場合、a - > b - > dは削除され、a - > b - > b - > c。これはうまくいかないかもしれません。 – Kris
あなたは1つのことを無視していますが、この解決策は、DataframeのwithColumn()関数内でドット表記を使用して内部列を呼び出す方法がないという制限(少なくとも私が知っている限り)に基づいています。これは作業する列名の単純な文字列を受け入れます。したがって、スケーラブルではない同じ構造を維持する必要があります。元の構造が異なる場合、コードも変更されます。コメントセクションは書式設定を許可しないため、修正されたコードを新しい回答として追加します... – KiranM