簡體   English   中英

相當於 TimestampType/java.sql.Timestamp 的 getLong?

[英]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.BigDecimal

DateType -> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM