如何使用 Java 从 Spark 中的列名列表创建结构列?

How to create a struct column from a list of column names in Spark with Java?

我有一个包含多列的 DataFrame,例如

root
 |-- playerName
 |-- country
 |-- bowlingAvg
 |-- bowlingSR
 |-- wickets
 |-- battingAvg
 |-- battingSR
 |-- runs

我还有一个与保龄球统计数据相对应的列名列表:

List bowlingParams = new ArrayList(Arrays.asList("bowlingAvg", "bowlingSR", "wickets"));

预期架构:

root
 |-- playerName
 |-- country
 |-- bowlingAvg
 |-- bowlingSR
 |-- wickets
 |-- battingAvg
 |-- battingSR
 |-- runs
 |-- bowlingStats 
       |-- bowlingAvg
       |-- bowlingSR
       |-- wickets

我可以这样做

playerDF = playerDF.withColumn("bowlingStats", functions.struct("bowlingAvg", "bowlingSR", "wickets"))

但是,我想使用列表动态地 select 结构的列。

我知道我们可以在 Scala 中这样做

playerDF = playerDF.select(struct(bowlingParams.map(col): _*))

而且,我还在

上找到了参考资料

我们可以在 Java 中使用 Spark 做到这一点吗?

对于 java 这个解决方案对我有用,

  • 从列表中删除一个属性(非动态属性)

  • 使用 JavaConverters 将剩余列表转换为 Scala 序列。

  • 创建嵌套列时,在结构中使用一个属性(作为字符串)和转换后的 Scala Seq。

     import scala.collection.JavaConverters; 
    
     List bowlingParams = new ArrayList(Arrays.asList("bowlingSR", "wickets"));
    
    
    playerDF = playerDF.withColumn("bowlingStats", functions.struct("bowlingAvg",JavaConverters.asScalaIteratorConverter(bowlingParams.iterator()).asScala().toSeq()));