ошибка: перегружено значение метода createDataFrame - PullRequest
0 голосов
/ 19 сентября 2019

Я пытался создать фрейм данных Apache Spark

val valuesCol = Seq(("Male","2019-09-06"),("Female","2019-09-06"),("Male","2019-09-07"))
valuesCol: Seq[(String, String)] = List((Male,2019-09-06), (Female,2019-09-06), (Male,2019-09-07))

Схема

val someSchema = List(StructField("sex", StringType, true),StructField("date", DateType, true))
someSchema: List[org.apache.spark.sql.types.StructField] = List(StructField(sex,StringType,true), StructField(date,DateType,true))

Не работает

val someDF = spark.createDataFrame(spark.sparkContext.parallelize(valuesCol),StructType(someSchema))

Я получил ошибку

<console>:30: error: overloaded method value createDataFrame with alternatives:
  (data: java.util.List[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
  (rdd: org.apache.spark.api.java.JavaRDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
  (rdd: org.apache.spark.rdd.RDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
  (rows: java.util.List[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
  (rowRDD: org.apache.spark.api.java.JavaRDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
  (rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame
 cannot be applied to (org.apache.spark.rdd.RDD[(String, String)], org.apache.spark.sql.types.StructType)
       val someDF = spark.createDataFrame(spark.sparkContext.parallelize(valuesCol),StructType(someSchema))

Должен ли я изменить форматирование даты в valuesCol?Что на самом деле вызывает эту ошибку?

Ответы [ 2 ]

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

С помощью import spark.implicits._ вы можете конвертировать Seq в Dataframe вместо

val df: DataFrame = Seq(("Male","2019-09-06"),("Female","2019-09-06"),("Male","2019-09-07"))
    .toDF() // <--- Here

Явно устанавливая имена столбцов:

val df: DataFrame = Seq(("Male","2019-09-06"),("Female","2019-09-06"),("Male","2019-09-07"))
    .toDF("sex", "date") 

Для нужной схемы вы можете либоприведите столбец или используйте другой тип

//Cast
Seq(("Male","2019-09-06"),("Female","2019-09-06"),("Male","2019-09-07"))
  .toDF("sex", "date")
  .select($"sex", $"date".cast(DateType))
  .printSchema()

//Types
val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
Seq(
  ("Male",   new java.sql.Date(format.parse("2019-09-06").getTime)),
  ("Female", new java.sql.Date(format.parse("2019-09-06").getTime)),
  ("Male",   new java.sql.Date(format.parse("2019-09-07").getTime)))
  .toDF("sex", "date")
  .printSchema()

//Output
root
 |-- sex: string (nullable = true)
 |-- date: date (nullable = true)

Что касается вашего вопроса, ваш тип rdd известен, Spark создаст схему в соответствии с ним.

val rdd: RDD[(String, String)] = spark.sparkContext.parallelize(valuesCol)
spark.createDataFrame(rdd)

root
 |-- _1: string (nullable = true)
 |-- _2: string (nullable = true)
1 голос
/ 19 сентября 2019

Вы можете указать valuesCol как Seq из Row вместо Seq из Tuple:

 val valuesCol = Seq(
    Row("Male", "2019-09-06"),
    Row ("Female", "2019-09-06"),
    Row("Male", "2019-09-07"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...