[英]Equivalent of getLong for a 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
})
我想知道时间戳是否有等效的类型化 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.BigDecimalDateType -> java.sql.Date TimestampType -> java.sql.Timestamp
BinaryType -> 字节数组 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 的情况下。时间戳,我必须放弃我的时间戳类型以换取其他东西?有人请解释为什么我错了!我现在只使用了 3-4 个月的 Scala 和 Spark。
-保罗
您已正确推断TimestampType
列的 Scala 类型是java.sql.Timestamp
。
从V1.5.0 开始。 org.apache.spark.sql.Row
有一个getTimestamp(i: Int)
方法,所以你可以调用它并获得一个java.sql.Timestamp
:
val timestamp = row.getTimestamp(1)
即使您使用早期版本,也没有必要放弃这种类型,您可以简单地将getAs[T](i: Int)
与java.sql.Timestamp
:
val timestamp = row.getAs[java.sql.Timestamp](2)
// OR:
val timestamp = row.getAs[java.sql.Timestamp]("timestamp")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.