2017-05-11 12 views
0

私はsparkの1つの寄木細工ファイルにマージする必要があるいくつかのバイナリファイルを持っています。私はこれを試しましたが、うまくいきません。エラーが言うようにあなたは、実際のデータはここでタプル複数のバイナリファイルをsparkで寄せ木にマージするにはどうすればいいですか?

Row("file_name" -> filePath, "content" -> content.toArray()) 

では、作成StringTypeする列を宣言し、

Caused by: java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: scala.Tuple2 is not a valid external type for schema of string 
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, file_name), StringType), true) AS file_name#55 
+- 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, file_name), 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 
    +- 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, file_name), StringType), true) 
     +- validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, file_name), StringType) 
     +- getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object), 0, file_name) 
      +- assertnotnull(input[0, org.apache.spark.sql.Row, true], top level row object) 
       +- input[0, org.apache.spark.sql.Row, true] 
... 
Caused by: java.lang.RuntimeException: scala.Tuple2 is not a valid external type for schema of string 
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply_0$(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:276) 
    ... 17 more 

答えて

0

val rdd = spark.sparkContext.binaryFiles("/mypath/*").map{case (filePath, content) => 
     Row("file_name" -> filePath, "content" -> content.toArray()) 
    } 
val schema = new StructType().add(StructField("file_name", StringType, true)).add(StructField("content", ArrayType(ByteType), true)) 
spark.createDataFrame(rdd, schema).show(1) 

私はこのスタックトレースを得ました2つのタプルの行ですが、スキーマは文字列と配列の列です。列名でタプルを作成する必要があると仮定すると、データを使用するだけです。スキーマを適用すると、列名が表示されます。

Row(filePath, content.toArray())を使用するか、スキーマを一致させるか、タプルを受け入れるようにスキーマを変更してください。

関連する問題