将常量结构列添加到 Spark DataFrame

MZS*_*MZS 5 dataframe apache-spark apache-spark-sql

我想struct从数据库集合中加载 a ,并将其作为常量列附加到 target 中的每一行DataFrame

我可以将我需要的列加载为DataFrame一行,然后执行 acrossJoin将其粘贴到目标的每一行:

val parentCollectionDF = /* ... load a single row from the database */
val constantCol = broadcast(parentCollectionDF.select("my_column"))
val result = childCollectionDF.crossJoin(constantCol)
Run Code Online (Sandbox Code Playgroud)

它可以工作,但感觉很浪费:子集合的每一行的数据都是恒定的,但 crossJoin 将其复制到每一行。

如果我可以对这些值进行硬编码,我可以使用类似childCollection.withColumn("my_column", struct(lit(val1) as "field1", lit(val2) as "field2" /* etc. */))但我提前不知道它们的东西;我需要从父集合中加载结构。

我正在寻找的是这样的:

childCollection.withColumn("my_column",
  lit(parentCollectionDF.select("my_column").take(1).getStruct(0))
Run Code Online (Sandbox Code Playgroud)

...但我可以从文字代码中看到,只有基本类型可以用作lit(). 在这里传递 GenericRowWithSchema 或案例类是没有好处的。

有没有一种不太笨拙的方法来做到这一点?(Spark 2.1.1、Scala)

[编辑:与这个问题不同,它解释了如何添加带有文字(硬编码)常量的结构。我的结构需要动态加载。]