2017-09-05 74 views
0

我正嘗試創建一個具有動態模式生成的數據框。下面的代碼片段:無法爲RDD創建數據框

def mapMetricList(row: Row): Seq[Metric] = ??? 

val fields = Seq("Field1", "Field2") 

case class Metric(name: String, count: Long) 
def convertMetricList(df: DataFrame): DataFrame = { 
    val outputFields = df.schema.fieldNames.filter(f => fields.contains(f)) 

    val rdd = df.rdd.map(row => { 
    val schema = row.schema 
    val metrics = mapMetricList(row) 
    val s = outputFields.map(name => row.get(schema.fieldIndex(name))) 
    Row.fromSeq(s ++ Seq(metrics)) 
    }) 

    val nonMetricsSchema = outputFields.map(f => df.schema.apply(f)) 
    val metricField = StructField("total",ArrayType(ScalaReflection.schemaFor[Metric].dataType.asInstanceOf[StructType]),nullable=true) 
    val schema = StructType(nonMetricsSchema ++ Seq(metricField)) 
    schema.printTreeString() 
    val dff = spark.createDataFrame(rdd, schema) 
    dff 
} 

但是我一直在運行期間獲得這些例外情況:

Caused by: java.lang.RuntimeException: Metric is not a valid external type for schema of struct<name:string,count:bigint> 
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.evalIfCondExpr3$(Unknown Source) 
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.evalIfFalseExpr4$(Unknown Source) 
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply(Unknown Source) 
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder.toRow(ExpressionEncoder.scala:290) 

我使用星火2.1.0

+0

如果類「公制」是內部的,則可能會出現此類錯誤。將類「公制」移至自己的文件。 – pasha701

+0

我曾嘗試將案例類移至單獨的文件,但錯誤仍然存​​在。 –

回答

0

我的電腦上運行良好星火1.6,我打印「convertMetricList」函數的結果。 也許問題在「metricField」字段「計數」類型。在提及你的蹤跡 「BIGINT」,在我的ENV類型爲 「LongType」:

StructField(total,ArrayType(
    StructType(StructField(name,StringType,true), 
    StructField(count,LongType,false) 
),true),true) 

您可以檢查你的ENV 「metricField」 類型。如果不同,解決方法是硬編碼度量結構。

+0

感謝您的回答,我已經在Spark 1.6上測試了我的代碼並且它可以工作。我不知道在2.0中發生了什麼變化,導致它停止工作。 –

+0

顯然這是在1.6中意外實現的,並從2.0中刪除。 https://issues.apache.org/jira/browse/SPARK-15507 –

+0

我也面臨同樣的問題。任何解決方案或解決這些問題 –