web-dev-qa-db-ja.com

Scala:Spark SQL to_date(unix_timestamp)がNULLを返す

_Spark Version: spark-2.0.1-bin-hadoop2.7 Scala: 2.11.8_

生のcsvをDataFrameにロードしています。 csvでは、列は日付形式でサポートされていますが、2016-10-25ではなく20161025と記述されています。パラメータ_date_format_には、yyyy-mm-dd形式に変換する必要のある列名の文字列が含まれています。

次のコードでは、最初にschemaを介してDate列のcsvをStringTypeとしてロードし、次に_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
}
_

返された上位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を取得するのはなぜですか?

5
Sai Wai Maung

yyyyMMddyyyy-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")
10
user6022341