Код Spark / Databricks не распознает ошибку поля даты - PullRequest
0 голосов
/ 30 сентября 2019

Я запрашиваю col в кадре данных искры, который я преобразовал в тип даты следующим образом:

SAlesByCountry2 = SAlesByCountry.withColumn ("SaleDate", current_date ())

Он преобразовануспешно см. следующее:

SAlesByCountry2:pyspark.sql.dataframe.DataFrame
CountryName:string
MakeName:string
ModelName:string
Cost:integer
RepairsCost:integer
PartsCost:string
TransportInCost:integer
Color:string
SalePrice:double
LineItemDiscount:string
InvoiceNumber:string
SaleDate:date
CustomerName:string
SalesDetailsID:integer`

Однако, когда я запрашиваю фрейм данных со следующим кодом sql:

SELECT
  *
FROM SAlesByCountry2
WHERE YEAR(SAlesByCountry2.SaleDate) = 2018

Я не получаю никаких данных, см. ниже

enter image description here

Несмотря на то, что 2018 год существует, когда я запрашиваю весь фрейм данных

enter image description here

Это очень озадачивает, поскольку должно просто показывать данные, но я не могу понять, почему не появляются данные, показывающие дату с годом 2018

1 Ответ

1 голос
/ 30 сентября 2019

В вашем коде много неясностей. Ниже заявление не меняет тип данных, оно инициализирует значение с сегодняшней датой (поэтому в этом случае нет вероятности получения данных с 2018 года)

SAlesByCountry2 = SAlesByCountry.withColumn("SaleDate", current_date())

Я вижу, что в вашем существующем dataframeстолбец SaleDate имеет формат даты, отличный от формата даты current_date() return. current_date() формат даты возврата a yyyy-MM-dd, но у вас есть данные с dd/MM/yyyy, где год функция не работает.

scala> df.withColumn("SaleDate",  current_date()).select(col("SaleDate")).show
+----------+
|  SaleDate|
+----------+
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
+----------+

year функцияработайте, когда у вас есть данные с форматом даты как yyyy-MM-dd.

 scala> df.withColumn("SaleDate",  date_format(current_date(), "dd/MM/yyyy")).filter(year(col("SaleDate")) === "2019").select(col("SaleDate")).show()
+--------+
|SaleDate|
+--------+
+--------+
scala> df.withColumn("SaleDate",  date_format(current_date(), "yyyy-MM-dd")).filter(year(col("SaleDate")) === "2019").select(col("SaleDate")).show
+----------+
|  SaleDate|
+----------+
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
|2019-09-30|
+----------+

Так что для решения вашей проблемы вам нужно изменить формат даты в столбце SaleDate на yyyy-MM-dd, как показано ниже, и подтвердить, что SaleDate столбец имеет уникальный формат для всех строк.

 df.withColumn("SaleDate" , date_format(to_date(col("SaleDate"), "dd/MM/yyyy"), "yyyy-MM-dd")).filter(year(col("SaleDate")) === "2018")
...