簡體   English   中英

Spark createDataFrame因ArrayOutOfBoundsException而失敗

[英]Spark createDataFrame failing with ArrayOutOfBoundsException

我是Spark的新手,在將RDD轉換為DataFrame時遇到了問題。 我要做的是獲取一個日志文件,使用現有的jar將其轉換為JSON(返回一個字符串),然后將生成的json轉換為數據幀。 這是我到目前為止:

val serverLog = sc.textFile("/Users/Downloads/file1.log")
val jsonRows = serverLog.mapPartitions(partition => {
  val txfm = new JsonParser //*jar to parse logs to json*//
  partition.map(line => {
    Row(txfm.parseLine(line))
  })
})

當我對此運行take(2) ,我得到類似的東西:

[{"pwh":"600","sVe":"10.0","psh":"667","udt":"mobile"}]
[{"pwh":"800","sVe":"10.0","psh":"1000","udt":"desktop"}]

我的問題來了。 我創建了一個模式並嘗試創建df

val schema = StructType(Array(
  StructField("pwh",StringType,true),
  StructField("sVe",StringType,true),...))

val jsonDf = sqlSession.createDataFrame(jsonRows, schema)

並且返回的錯誤是

java.lang.RuntimeException: Error while encoding: java.lang.ArrayIndexOutOfBoundsException: 1
if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, pwh), StringType), true) AS _pwh#0
+- if (assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, pwh), StringType), true)
:- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object).isNullAt
:  :- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object)
:  :  +- input[0, org.apache.spark.sql.Row, true]
:  +- 0
:- null

誰能告訴我這里我做錯了什么? 我發現的大部分SO答案都說我可以使用createDataFrametoDF() ,但我也沒有運氣。 我也嘗試將RDD轉換為JavaRDD ,但這也行不通。 欣賞您可以提供的任何見解。

您定義的模式適用於RDD,如:

{"pwh":"600","sVe":"10.0","psh":"667","udt":"mobile"}
{"pwh":"800","sVe":"10.0","psh":"1000","udt":"desktop"}

如果您可以更改您的RDD以使數據為

{"logs": [{"pwh":"600","sVe":"10.0","psh":"667","udt":"mobile"}]}

使用此架構:

val schema = StructType(Seq(
  StructField("logs",ArrayType( StructType(Seq(
    StructField("pwh",StringType,true),
    StructField("sVe",StringType,true), ...))
  ))
))

sqlContext.read.schema(schema).json(jsonRows)

暫無
暫無

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

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