getLong对于TimestampType / java.sql.Timestamp等价吗?
我试图从一个火花流数据框中使用scala提取一些代码,如下所示:
var txs = spark.readStream
  .format("kafka") .option("kafka.bootstrap.servers",KAFKABS)
  .option("subscribe", "txs")
  .load()
txs = txs.selectExpr("CAST(value AS STRING)")
val schema = StructType(Seq(
      StructField("from",StringType,true),
      StructField("to", StringType, true),  
      StructField("timestamp", TimestampType, true),
        StructField("hash", StringType, true),
      StructField("value", StringType, true)
))
txs = txs.selectExpr("cast (value as string) as json")
            .select(from_json($"json", schema).as("data"))
            .select("data.*")
            .selectExpr("from","to","cast(timestamp as timestamp) as timestamp","hash","value") 
val newDataFrame = txs
  .flatMap(row => {
    val to = row.getString(0)
    val from = row.getString(1)
   // val timestamp = row.getTimestamp??
   //do stuff
  })
  我想知道是否有一个等效的Timestamps类型的get方法?  为了增加我的困惑,似乎在我为结构化流定义的SQL类型和通过flatMap函数访问它们时变量的实际类型之间存在某种隐藏映射(至少对我来说是隐藏的)。  我查看了文档,事实确实如此。  根据文件: 
返回位置i处的值。 如果该值为null,则返回null。 以下是Spark SQL类型和返回类型之间的映射:
  BooleanType  - > java.lang.Boolean ByteType  - > java.lang.Byte 
  ShortType  - > java.lang.Short IntegerType  - > java.lang.Integer 
  FloatType  - > java.lang.Float DoubleType  - > java.lang.Double 
  StringType  - > String DecimalType  - > java.math.BigDecimal 
DateType - > java.sql.Date TimestampType - > java.sql.Timestamp
BinaryType - > byte数组ArrayType - > scala.collection.Seq(使用java.util.List的getList)MapType - > scala.collection.Map(使用java.util.Map的getJavaMap)StructType - > org.apache.spark。 sql.Row
  考虑到这一点,我预料到这种映射会更正式地作为它实现的接口烘焙到Row类中,但显然情况并非如此:(在TimestampType / java.sql的情况下似乎是这样。时间戳,我不得不放弃我的时间戳类型的其他东西吗?有人请解释我为什么错了!我只使用scala和火花3-4个月现在。 
- 保罗
  您已经正确推断出TimestampType列的Scala类型是java.sql.Timestamp 。 
  截至V1.5.0 。  org.apache.spark.sql.Row有一个getTimestamp(i: Int)方法,所以你可以调用它并得到一个java.sql.Timestamp : 
val timestamp = row.getTimestamp(1)
  即使你使用的是早期版本,也没有必要放弃这种类型,你可以简单地使用java.sql.Timestamp的getAs[T](i: Int) : 
val timestamp = row.getAs[java.sql.Timestamp](2)
// OR:
val timestamp = row.getAs[java.sql.Timestamp]("timestamp")
上一篇: Equivalent of getLong for a TimestampType/java.sql.Timestamp?
