Unix преобразование времени с выбором в Scala - PullRequest
0 голосов
/ 22 февраля 2020

Я загрузил DatingDF, который выглядит так:

+---+--------+------+---+---------+
|Uid|Zip_Code|Height|Age|Meet_Date|
+---+--------+------+---+---------+
|  1|   90117|   171| 22|881250949|
|  2|   90340|   168| 24|891717742|
|  3|   92552|   170| 38|878887116|
|  4|   90455|   175| 41|880606923|
|  5|   91045|   165| 25|886397596|
|  6|   90050|   172| 32|884182806|
|  7|   90110|   166| 27|881171488|
|  8|   90340|   169| 49|891628467|
|  9|   91040|   175| 51|886324817|
| 10|   90320|   169| 32|883603013|
+---+--------+------+---+---------+

Meet_Date представлен в Unix времени в секундах с 01.01.1970 UT C. Определена схема:

val datingSchema=StructType(Array(
  StructField("Uid",IntegerType,true),
  StructField("Zip_Code",IntegerType,true),
  StructField("Height",IntegerType,true),
  StructField("Age",IntegerType,true),
  StructField("Meet_Date",IntegerType,true))
)

Я хочу перечислить DF в порядке гггг, преобразованного со времени Unix. Я выполнил запрос ниже, но получил ошибку о типе String?;

scala> val df1=datingDF.select("Uid","Zip_Code","Height","Age",from_unixtime(col("Meet_Date"), "yyyy")).orderBy("Meet_Date")
<console>:31: error: overloaded method value select with alternatives:
  [U1, U2, U3, U4, U5](c1: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U1], c2: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U2], c3: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U3], c4: 
org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U4], c4: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U5])org.apache.spark.sql.Dataset[(U1, U2, U3, U4, U5)] <and>
  (col: String,cols: String*)org.apache.spark.sql.DataFrame <and>
  (cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
 cannot be applied to (String, String, String, String, org.apache.spark.sql.Column)
       val df1=datingDF.select("Uid","Zip_Code","Height","Age",from_unixtime(col("Meet_Date"), "yyyy")).orderBy("Meet_Date")
                       ^

Я знаю, что правильно преобразовал Unix время;

scala> val df2=datingDF.select(from_unixtime(col("Meet_Date"), "yyyy")).orderBy("Meet_Date")
df2: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [from_unixtime(Meet_Date, yyyy): string]

scala> df2.show(5)
+------------------------------+                                                     
|from_unixtime(Meet_Date, yyyy)|
+------------------------------+
|                          1997|
|                          1997|
|                          1997|
|                          1997|
|                          1997|
+------------------------------+

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 22 февраля 2020

Глядя на сообщение об ошибке: cannot be applied to (String, String, String, String, org.apache.spark.sql.Column) мы видим, что это тип того, что вы вставили в выражение выбора, что является неправильным. И если вы посмотрите прямо перед тем, как он говорит, что выбор может быть применен к (col: String,cols: String*) и (cols:org.apache.spark.sql.Column*). Попробуйте вместо этого:

val df1=datingDF.select(col("Uid"),col("Zip_Code"),col("Height"),col("Age"),from_unixtime(col("Meet_Date"), "yyyy")).orderBy("Meet_Date")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...