如何使用 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()));
我有一个包含多列的 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()));