簡體   English   中英

Spark結構化流式數據磚事件中心模式定義問題

[英]Spark Structured Streaming Databricks Event Hub Schema Defining issue

我在定義json文檔的結構時遇到問題。 在此處輸入圖片說明

現在,我正在嘗試在streamread上執行相同的架構。

val jsonSchema = StructType([ StructField("associatedEntities", struct<driver:StringType,truck:StringType>, True), 
                          StructField("heading", StringType, True), 
                          StructField("location", struct<accuracyType:StringType,captureDateTime:StringType,cityStateCode:StringType,description:StringType,latitude:DoubleType,longitude:DoubleType,quality:StringType,transmitDateTime:StringType>, True), 
                          StructField("measurements", array<struct<type:StringType,uom:StringType,value:StringType>>, True), 
                          StructField("source", struct<entityType:StringType,key:StringType,vendor:StringType>, True), 
                          StructField("speed", DoubleType, True)])

val df = spark
 .readStream
 .format("eventhubs")
 //.schema(jsonSchema) 
 .options(ehConf.toMap)
 .load()

當我在筆記本中運行此單元格時“:15:錯誤:簡單表達式的非法開頭val jsonSchema = StructType([StructField(“ associatedEntities”,struct,True),”

編輯:目標是將數據放入數據框。 我可以從事件中心消息的正文中獲取json字符串,但是如果我無法使模式正常工作,我不確定從那里可以做什么。

您由於架構定義而收到錯誤消息。 模式定義應如下所示:

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

val jsonSchema = StructType(
                        Seq(StructField("associatedEntities", 
                                        StructType(Seq(
                                          StructField("driver", StringType), 
                                          StructField ("truck", StringType)
                                        ))),
                            StructField("heading", StringType),
                            StructField("measurements", ArrayType(StructType(Seq(StructField ("type", StringType), StructField ("uom", StringType), StructField("value", StringType)))))
                           )
                         )

您可以使用以下方法仔細檢查架構:

jsonSchema.printTreeString

返回架構:

root
 |-- associatedEntities: struct (nullable = true)
 |    |-- driver: string (nullable = true)
 |    |-- truck: string (nullable = true)
 |-- heading: string (nullable = true)
 |-- measurements: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- type: string (nullable = true)
 |    |    |-- uom: string (nullable = true)
 |    |    |-- value: string (nullable = true)

如注釋中所述,您將獲得二進制數據。 因此,首先獲得原始數據幀:

val rawData = spark.readStream
  .format("eventhubs")
  .option(...)
  .load()

你必須:

  • 將數據轉換為字符串
  • 解析嵌套的json
  • 弄平

用解析的數據定義數據框:

val parsedData = rawData
   .selectExpr("cast (Body as string) as json")
   .select(from_json($"json", jsonSchema).as("data"))
   .select("data.*")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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