如何在Spark SQL中向现有Dataframe添加新列

时间:2015-08-21 08:57:05

标签: java-8 dataframe apache-spark-sql spark-dataframe

我使用DataFrame API

我有现有的DataFrame和一个List对象(也可以使用Array)。如何将此List作为新列添加到现有DataFrame?我应该使用课程Column吗?

4 个答案:

答案 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...