Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在Spark中将CSV读取到数据帧时指定多个TimestampType和DataType格式?_Apache Spark_Pyspark_Apache Spark Sql_Spark Dataframe_Pyspark Sql - Fatal编程技术网

Apache spark 如何在Spark中将CSV读取到数据帧时指定多个TimestampType和DataType格式?

Apache spark 如何在Spark中将CSV读取到数据帧时指定多个TimestampType和DataType格式?,apache-spark,pyspark,apache-spark-sql,spark-dataframe,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Spark Dataframe,Pyspark Sql,我正在读取的CSV文件包含3列。以下是列的格式 schema_datatype = StructType([StructField('DateTime1',TimestampType(),True), StructField('DateTime2',TimestampType(),True), StructField('Date',DataType(),True)]) df= spark.read.csv(header=True,\ path="sample.csv",\ schema=sc

我正在读取的CSV文件包含3列。以下是列的格式

schema_datatype = StructType([StructField('DateTime1',TimestampType(),True),
StructField('DateTime2',TimestampType(),True),
StructField('Date',DataType(),True)])


df= spark.read.csv(header=True,\
path="sample.csv",\
schema=schema_datatype, \
timestampFormat="mm/dd/yyyy hh:mm:ss")
  • DateTime1的格式为“mm/dd/yyyy hh:mm:ss”
  • DateTime2的格式为“dd/mm/yy hh:mm:ss”
  • 日期格式为“mm/dd/yyyy”
  • 下面的代码允许所有列使用一种时间格式

    schema_datatype = StructType([StructField('DateTime1',TimestampType(),True),
    StructField('DateTime2',TimestampType(),True),
    StructField('Date',DataType(),True)])
    
    
    df= spark.read.csv(header=True,\
    path="sample.csv",\
    schema=schema_datatype, \
    timestampFormat="mm/dd/yyyy hh:mm:ss")
    
    但在使用read.csv时,如何指定每列的日期格式。 PS:我正在使用Spark 2.1.0


    谢谢

    我也有类似的要求。我使用下面的代码使用推断模式选项读取csv

     Dataset<Row> data = sparkSession.read().format(fileType).option("header",header).option("inferSchema", "true").option("delimiter",delimeter).option("mode", "DROPMALFORMED").load(filePath);
    
    Then i formatted the date using the below statement.
    data=data.withColumn("the_date", to_date(unix_timestamp(col("the_date"), "mm/dd/yyyy").cast("timestamp")));
    
    Dataset data=sparkSession.read().format(fileType)。选项(“header”,header)。选项(“inferSchema”,“true”)。选项(“delimiter”,delimeter)。选项(“mode”,“dropmorformed”)。加载(filePath);
    然后我用下面的语句格式化了日期。
    data=data.withColumn(“日期”),to(“日期”(unix时间戳(“日期”),“mm/dd/yyyy”).cast(“时间戳”);
    
    我认为你做不到,但我可能错了。一种解决方法是将列读取为字符串,然后再将其转换为
    时间戳
    。是的,但在Bigdata Right上分两步进行计算效率低下。我不认为这会太糟糕,无法与
    连接
    ,等等。您可以使用
    unix\u时间戳
    进行尝试。同意第一条注释,无论是早还是晚,我们只进行一次转换。当读取csv文件时,转换需要时间。Shaido建议的最佳方式。如本文所述: