在Java中,从DataFrame-Spark中的列的时间戳中仅提取日期

在Java中,从DataFrame-Spark中的列的时间戳中仅提取日期,java,apache-spark,Java,Apache Spark,我有cloudera-quickstart-vm-5.13.0环境。在此环境中,已经安装了Hadoop和Spark。我已将csv文件放入hdfs。然后,我编写了这个java代码来读取csv,并尝试计算每天有多少条出租车路线(例如,2019年10月10日有29条出租车路线,2019年11月10日有16条出租车路线等等)。Csv文件字段包括: ●taxi_id​ ●pickup_datetime​ ●passengers​ ●pick_lon​ ●pick_lat​ .我的java代码是

我有cloudera-quickstart-vm-5.13.0环境。在此环境中,已经安装了Hadoop和Spark。我已将csv文件放入hdfs。然后,我编写了这个java代码来读取csv,并尝试计算每天有多少条出租车路线(例如,2019年10月10日有29条出租车路线,2019年11月10日有16条出租车路线等等)。Csv文件字段包括:

●taxi_id​ 
●pickup_datetime​ 
●passengers​ 
●pick_lon​ 
●pick_lat​ 
.我的java代码是:

package com.bigdata.taxi;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;


public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        SparkConf conf = new SparkConf();
        conf.setAppName("My 1st Spark app");
        conf.setMaster("local[*]");
        JavaSparkContext sc = new JavaSparkContext(conf);

        SparkSession sparkSession = SparkSession.builder().sparkContext(sc.sc()).getOrCreate();

        //Now read csv , from hdfs source
        //[cloudera@quickstart ~]$ hdfs dfs -put /home/cloudera/Desktop/fares.csv hdfs://quickstart.cloudera:8020//user//cloudera//fares.csv
        Dataset<Row> df = sparkSession.read().option("header", true).option("inferSchema", "true").
                option("timestampFormat", "yyyy-MM-dd hh:mm:ss").csv("hdfs://quickstart.cloudera:8020//user//cloudera//fares.csv");
        df.show(); //only showing top 20 rows

        Dataset<Row> df2 = df.orderBy("pickup_datetime").groupBy("pickup_datetime").count();
        df2.show();
    }
}
package com.bigdata.taxi;
导入org.apache.spark.SparkConf;
导入org.apache.spark.api.java.JavaSparkContext;
导入org.apache.spark.sql.Dataset;
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.SparkSession;
公共班机{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
SparkConf conf=新的SparkConf();
conf.setAppName(“我的第一个Spark应用”);
conf.setMaster(“本地[*]”);
JavaSparkContext sc=新的JavaSparkContext(conf);
SparkSession SparkSession=SparkSession.builder().sparkContext(sc.sc()).getOrCreate();
//现在从hdfs源读取csv
//[cloudera@quickstart~]$hdfs dfs-put/home/cloudera/Desktop/fares.csvhdfs://quickstart.cloudera:8020//user//cloudera//fares.csv
Dataset df=sparkSession.read().option(“header”,true)。option(“推断模式”,“true”)。
选项(“时间戳格式”,“yyyy-MM-dd hh:MM:ss”).csv(“hdfs://quickstart.cloudera:8020//user//cloudera//fares.csv");
df.show();//仅显示前20行
数据集df2=df.orderBy(“picku_datetime”).groupBy(“picku_datetime”).count();
df2.show();
}
}
.但是,我的问题是,Picking_datetime字段不仅包含日期,还包含小时、分钟和秒。那么,如何通过java将hh:mm:ss从数据帧中的列picku\datetime中删除呢


谢谢

您可以添加仅包含日期的新列。这很有帮助

df=df.withColumn(“拾取日期”,日期格式(col(“拾取日期时间”),“yyyy-MM-dd”);
在下面的代码中,只需使用列
picku\u date
而不是
picku\u datetime

注意:您需要导入火花:

import static org.apache.spark.sql.functions.*;