我使用DataFrame API。
我有现有的DataFrame和一个List对象(也可以使用Array)。如何将此List作为新列添加到现有DataFrame?我应该使用课程Column吗?
答案 0 :(得分:5)
您应该将您的列表转换为单个列RDD并在您的critetia pickeg上应用联接。简单的DataFrame转换:
val df1 = sparkContext.makeRDD(yourList).toDF("newColumn")
如果您需要创建其他列来执行连接,则可以添加更多列,映射列表:
val df1 = sparkContext.makeRDD(yourList).map(i => (i, fun(i)).toDF("newColumn", "joinOnThisColumn")
我不熟悉Java版本,但您应该尝试使用JavaSparkContext.parallelize(yourList)
并根据this doc应用类似的映射操作。
答案 1 :(得分:2)
以下是我们有一个列日期并想要添加另一个月份列的示例。
Dataset<Row> newData = data.withColumn("month", month((unix_timestamp(col("date"), "MM/dd/yyyy")).cast("timestamp")));
希望这有帮助!
干杯!
答案 2 :(得分:1)
抱歉,这是我的错,我已经找到了解决我问题的函数withColumn(String colName, Column col)
答案 3 :(得分:1)
这个帖子有点旧,但我遇到了类似的情况使用Java。我认为最重要的是,我对如何解决这个问题存在概念上的误解。
为了解决我的问题,我创建了一个简单的POJO来协助数据集的新列(而不是尝试在现有的列上构建)。我认为从概念上讲,我并不了解最好在初始读取期间生成数据集,其中需要添加额外的列。我希望这可以帮助将来的某个人。
请考虑以下事项:
JavaRDD<MyPojo> myRdd = dao.getSession().read().jdbc("jdbcurl","mytable",someObject.getProperties()).javaRDD().map( new Function<Row,MyPojo>() {
private static final long serialVersionUID = 1L;
@Override
public MyPojo call(Row row) throws Exception {
Integer curDos = calculateStuff(row); //manipulate my data
MyPojo pojoInst = new MyPojo();
pojoInst.setBaseValue(row.getAs("BASE_VALUE_COLUMN"));
pojoInst.setKey(row.getAs("KEY_COLUMN"));
pojoInst.setCalculatedValue(curDos);
return pojoInst;
}
});
Dataset<Row> myRddRFF = dao.getSession().createDataFrame(myRdd, MyPojo.class);
//continue load or other operation here...