3

Spark Version: spark-2.0.1-bin-hadoop2.7 Scala: 2.11.8Scala: Spark SQL to_date (UNIX_TIMESTAMP) возвращение NULL

Я загрузке сырой CSV в DataFrame. В csv, хотя столбец поддерживает формат даты, они записываются как 20161025 вместо 2016-10-25. Параметр date_format включает строку имен столбцов, которые необходимо преобразовать в формат yyyy-mm-dd.

В следующем коде, я первый погрузил CSV финикового столбца как StringType через schema, а затем проверить, если date_format не пусто, то есть столбцы, которые должны быть преобразованы в Date из String, то лить каждую колонку, используя unix_timestamp и to_date. Однако в csv_df.show() возвращенными строками являются все null.

def read_csv(csv_source:String, delimiter:String, is_first_line_header:Boolean, 
    schema:StructType, date_format:List[String]): DataFrame = { 
    println("|||| Reading CSV Input ||||") 

    var csv_df = sqlContext.read 
     .format("com.databricks.spark.csv") 
     .schema(schema) 
     .option("header", is_first_line_header) 
     .option("delimiter", delimiter) 
     .load(csv_source) 
    println("|||| Successfully read CSV. Number of rows -> " + csv_df.count() + " ||||") 
    if(date_format.length > 0) { 
     for (i <- 0 until date_format.length) { 
      csv_df = csv_df.select(to_date(unix_timestamp(
       csv_df(date_format(i)), "yyyy-­MM-­dd").cast("timestamp"))) 
      csv_df.show() 
     } 
    } 
    csv_df 
} 

Возвращается Top 20 строк:

+-------------------------------------------------------------------------+ 
|to_date(CAST(unix_timestamp(prom_price_date, YYYY-­MM-­DD) AS TIMESTAMP))| 
+-------------------------------------------------------------------------+ 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
|                  null| 
+-------------------------------------------------------------------------+ 

Почему я получаю все null?

ответ

8

Для преобразования yyyyMMdd в yyyy-MM-dd вы можете:

spark.sql("""SELECT DATE_FORMAT(
    CAST(UNIX_TIMESTAMP('20161025', 'yyyyMMdd') AS TIMESTAMP), 'yyyy-MM-dd' 
)""") 

с функциями:

date_format(unix_timestamp(col, "yyyyMMdd").cast("timestamp"), "yyyy-MM-dd") 
Смежные вопросы