Apache Spark – 添加两列
有没有办法添加两列,以便第一列是日期,第二列包含需要添加的天数? 我尝试着
date_add(res.col("date"), res.col("days"));
但这不起作用,因为date_add()
需要一个Column
和一个int
,而我有两列。
谢谢!
这是DataFrame
DSL的限制, DataFrame
不是引擎本身。 它不是最佳的,但你可以用expr
替换函数调用:
import org.apache.spark.sql.functions.{expr, col} val df = Seq(("2012-04-05", 6)) .toDF("date", "days") .withColumn("date", col("date").cast("date")) df.select(expr("date_add(date, days)"))
以下是使用UDF的解决方案:请参阅udfDateAdd()
以下函数定义
这里不能使用sql函数date_add():java.sql.Date首先转换为LocalDate(java8),在此之后添加,然后再转换回java.sql.Date:
import java.sql.Date import java.time.LocalDate; // sample data val df = Seq(("2015-02-21", 8), ("2016-02-21", 8)).toDF("date", "days"). withColumn("date", col("date").cast("date")) val udfDateAdd=udf[Date,Date,Int]{ (dt,inc) => java.sql.Date.valueOf( dt.toLocalDate().plusDays(inc) ) }
结果:
df.withColumn("newdate", udfDateAdd($"date",$"days")).show() +----------+----+----------+ | date|days| newdate| +----------+----+----------+ |2015-02-21| 8|2015-03-01| |2016-02-21| 8|2016-02-29| +----------+----+----------+
- Spark on yarn jar上传问题
- Spark DataFrame – 选择n个随机行
- 在Spark MLlib上使用Java中的Breeze
- 如何更新火花流中的广播变量?
- 带有DataFrame API的Apache Spark MLlib在createDataFrame()或read()时会产生java.net.URISyntaxException .csv(…)
- 如何使用Java有效地读取Hadoop(HDFS)文件中的第一行?
- 如何将自定义Java类转换为Spark数据集
- java.lang.NoClassDefFoundError:org / apache / spark / Logging
- 为什么Apache Spark在客户端上执行filter