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)
[编辑:与这个问题不同,它解释了如何添加带有文字(硬编码)常量的结构。我的结构需要动态加载。]
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |