Предположим, у меня есть следующие данные XML:
<students>
<studentId>110</studentId>
<info>
<rollNo>2</rollNo>
<address>
<permanent>abc</permanent>
<temporary>def</temporary>
</address>
</info>
<subjects>
<subject>
<name>maths</name>
<credit>3</credit>
</subject>
<subject>
<name>science</name>
<credit>2</credit>
</subject>
</subjects>
</students>
И его схема:
root
|-- info: struct (nullable = true)
| |-- address: struct (nullable = true)
| | |-- permanent: string (nullable = true)
| | |-- temporary: string (nullable = true)
| |-- rollNo: long (nullable = true)
|-- studentId: long (nullable = true)
|-- subjects: struct (nullable = true)
| |-- subject: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- credit: long (nullable = true)
| | | |-- name: string (nullable = true)
в качестве корневого тега "students"
.
Здесь яхотел обновить значение некоторых столбцов.
Я хотел обновить значение столбца "studentId"
, используя UDF
. И я нашел способ:
df = df.withColumn("studentId", updateValue(col("studentId")))
Затем я хотел обновить вложенный столбец, т.е. "info.rollNo"
. Применение вышеуказанного процесса дало мне еще один новый столбец как "<info.rollNo>updated_value</info.rollNo>
". Поискав некоторое время, я нашел способ:
val colStruct = df.select(col("info" + ".*")).columns
.filter(_ != "rollNo")
.map(f => col("info" + "." + f))
df = df.withColumn("info",
struct(
(colStruct :+ updateValue(col("info.rollNo")
).as("rollNo")): _*)
)
Для третьих вложенных столбцов я попробовал вышеупомянутый способ. Но я не мог понять процесс. Здесь вопрос заключается в том, может ли кто-нибудь объяснить мне алгоритм обновления значения вложенных столбцов, уровень вложенности которого может быть 3,4,5 и так далее. Для экземпляра: я хочу обновить следующие поля. "info.address.permanent"
, который является struct, и "subjects.subject.credit"
, который является элементом массива "subject"
PS: Если вам известны какие-либо другие способы обновления определенных столбцов, то, пожалуйста, укажите это.