重命名scala spark DataFrame 中的嵌套元素


0

我有一个带有嵌套结构的Spark Scala DataFrame :

 |-- _History: struct (nullable = true)
 |    |-- Article: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- Id: string (nullable = true)
 |    |    |    |-- Timestamp: long (nullable = true)
 |    |-- Channel: struct (nullable = true)
 |    |    |-- <font><font>Cultura pop</font></font>: array (nullable = true)
 |    |    |    |-- element: long (containsNull = true)
 |    |    |-- <font><font>Deportes</font></font>: array (nullable = true)
 |    |    |    |-- element: long (containsNull = true)

我正在尝试重命名嵌套元素(例如deportes->to deportes)。有没有一种方法可以使用UDF或类似的东西来实现这一点?

我尝试过以下方法,但不起作用:

var filterDF2 = filterDF
  .withColumnRenamed("_History.Channel.<font><font>Deportes</font></font>", "_History.Channel.Deportes")

1 答案

0

最简单的方法是使用具有正确命名的模式字符串(或等效的structfield定义)的类型 transformation:

val schema = """struct<
  Article: array<struct<Id:string,Timestamp:bigint>>,
  Channel: struct<Cultura: bigint, Deportes: array<bigint>>>"""
df.withColumn("_History", $"_History".cast(schema))

您还可以使用案例类对此进行建模:

import org.apache.spark.sql.Row

case class ChannelRecord(Cultura: Option[Long], Deoprtes: Option[Seq[Long]])

val rename = udf((row: Row) =>
ChannelRecord(Option(row.getLong(0)), Option(row.getSeqLong)))

df.withColumn("_History",
struct($"_History.Article", rename($"_History.channel").alias("channel")))


我来回答