2016-03-30 2 views
0

Я новичок в Spark и Scala. Я застрял в этом исключении. Я пытаюсь добавить дополнительные поля, то есть StructField, в существующий StructType, полученный из Кадр данных для столбца с использованием Spark SQL и gettting ниже исключения.org.apache.spark.sql.types.DataTypeException: Unsupported dataType: IntegerType

фрагмент кода:

val dfStruct:StructType=parquetDf.select("columnname").schema 
dfStruct.add("newField","IntegerType",true) 

Исключение в потоке «главный»

org.apache.spark.sql.types.DataTypeException: Unsupported dataType: IntegerType. If you have a struct and a field name of it has any special characters, please use backticks (`) to quote that field name, e.g. `x+y`. Please note that backtick itself is not supported in a field name. 
    at org.apache.spark.sql.types.DataTypeParser$class.toDataType(DataTypeParser.scala:95) 
    at org.apache.spark.sql.types.DataTypeParser$$anon$1.toDataType(DataTypeParser.scala:107) 
    at org.apache.spark.sql.types.DataTypeParser$.parse(DataTypeParser.scala:111) 

Я вижу там некоторые открытые вопросы, работающие на JIRA, связанных с этим исключением, но не в состоянии многое понять. Я использую Спарк 1.5.1 версия

https://mail-archives.apache.org/mod_mbox/spark-issues/201508.mbox/%[email protected]A%3E

https://mail-archives.apache.org/mod_mbox/spark-issues/201508.mbox/%[email protected]A%3E

https://issues.apache.org/jira/browse/SPARK-9685

ответ

1

При использовании StructType.add со следующей подписью:

add(name: String, dataType: String, nullable: Boolean) 

dataType строка должна соответствовать либо .simpleString или .typeName , Для IntegerType это либо int:

import org.apache.spark.sql.types._ 

IntegerType.simpleString 
// String = int 

или integer:

IntegerType.typeName 
// String = integer 

так, что вам нужно что-то вроде этого:

val schema = StructType(Nil) 

schema.add("foo", "int", true) 
// org.apache.spark.sql.types.StructType = 
// StructType(StructField(foo,IntegerType,true)) 

или

schema.add("foo", "integer", true) 
// org.apache.spark.sql.types.StructType = 
// StructType(StructField(foo,IntegerType,true)) 

Если вы хотите передать IntegerType он должен быть DataType не String:

schema.add("foo", IntegerType, true) 
+0

Спасибо за быстрый ответ zero323, я могу теперь добавить StructFiled к существующим StructType. Причина в том, что моя IDE не импортировала «import org.apache.spark.sql.types._», следовательно, не удалось скомпилировать этот код StructType ( StructField («column1», DoubleType, false) :: StructField (" column2" , DoubleType, ложь) :: StructField ("колонка3", StringType, ложь) :: Nil) \t поэтому я был Tyring с апи dfStruct.add ("Ньюфилд", "IntegerType", правда) \t после записи инструкции import вручную я могу исправить эту проблему. – nilesh1212