【问题标题】:Error importing types from Spark SQL从 Spark SQL 导入类型时出错
【发布时间】:2015-08-26 06:47:36
【问题描述】:

我正在尝试从 spark sql 导入类型,如下所示

导入 org.apache.spark.sql.types._

但我收到错误消息,例如:“未找到:值 DataType”、“未找到:类型 ByteType”

完整代码是

import java.math.BigDecimal                                                                           
import java.sql.{Timestamp, Date}                                                                     

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

/**                                                                                                   
 * Utility functions for type casting                                                                 
 */                                                                                                   
object TypeCast {                                                                                     

  /**                                                                                                 
   * Casts given string datum to specified type.                                                      
   * Currently we do not support complex types (ArrayType, MapType, StructType).                      
   *                                                                                                  
   * @param datum string value                                                                        
   * @param castType SparkSQL type                                                                    
   */                                                                                                 
  def castTo(datum: String, castType: DataType): Any = {                                              
    castType match {                                                                                  
      case _: ByteType => datum.toByte                                                                
      case _: ShortType => datum.toShort                                                              
      case _: IntegerType => datum.toInt                                                              
      case _: LongType => datum.toLong                                                                
      case _: FloatType => datum.toFloat                                                              
      case _: DoubleType => datum.toDouble                                                            
      case _: BooleanType => datum.toBoolean                                                          
      case _: DecimalType => new BigDecimal(datum.replaceAll(",", ""))                                
      case _: TimestampType => Timestamp.valueOf(datum)                                               
      case _: DateType => Date.valueOf(datum)                                                         
      case _: StringType => datum                                                                     
      case _ => throw new RuntimeException(s"Unsupported type: ${castType.typeName}")                 
    }                                                                                                 
  }                                                                                                   

【问题讨论】:

  • 大概您/没有收到导入错误,但稍后。向我们展示代码。并且“未找到:value DataType”表明编译器此时不期望类型...
  • 更新了原来的问题
  • 我没有收到任何“未找到:值 DataType”错误,另外从源 IntType 等看是案例对象,而不是类型/类。

标签: scala apache-spark-sql


【解决方案1】:

ByteType 等不是类型,而是单例对象。

所以你可能想要这样的东西:

 def castTo(datum: String, castType: DataType): Any = {                                              
    castType match {                                                                                  
      case DataType.ByteType => datum.toByte                                                                
      case DataType.ShortType => datum.toShort                                                              
      case DataType.IntegerType => datum.toInt                                                              
      case DataType.LongType => datum.toLong                                                                
      case DataType.FloatType => datum.toFloat                                                              
      case DataType.DoubleType => datum.toDouble                                                            
      case DataType.BooleanType => datum.toBoolean                                                          
      case DataType.DecimalType => new BigDecimal(datum.replaceAll(",", ""))                                
      case DataType.TimestampType => Timestamp.valueOf(datum)                                               
      case DataType.DateType => Date.valueOf(datum)                                                         
      case DataType.StringType => datum                                                                     
      case _ => throw new RuntimeException(s"Unsupported type: ${castType.typeName}")                 
    }                                                                                                 
  }

(除了至少在我的 Spark 版本中,没有 DecimalType,并且 castType 没有 typeName 字段)

【讨论】:

  • 谢谢!一周前开始在 Scala 中编程,所以仍然对一些事情感到困惑。我从github.com/databricks/spark-csv/blob/master/src/main/scala/com/…得到代码
  • 解释您正在使用其他人的代码确实可能是个好主意。我建议你联系那个包的作者 - 我看不出它是如何工作的,至少在我的 Spark 版本中,因为 ByteType 等真的不是类型
  • 可能是一个愚蠢的问题,但我怎么知道它是 Type 还是单例对象?如果我同时定义了类 ByteType 和对象 ByteType。前者是Type,后者是单例对象......
  • 我结合了查看我的 IDE 所说的内容和谷歌搜索!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2016-11-29
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多