76

マップ/配列などの複雑な型で RDD をクエリするにはどうすればよいですか? たとえば、このテスト コードを書いていたとき:

case class Test(name: String, map: Map[String, String])
val map = Map("hello" -> "world", "hey" -> "there")
val map2 = Map("hello" -> "people", "hey" -> "you")
val rdd = sc.parallelize(Array(Test("first", map), Test("second", map2)))

構文は次のようになると思いました。

sqlContext.sql("SELECT * FROM rdd WHERE map.hello = world")

また

sqlContext.sql("SELECT * FROM rdd WHERE map[hello] = world")

しかし、私は得る

タイプ MapType(StringType,StringType,true) のネストされたフィールドにアクセスできません

org.apache.spark.sql.catalyst.errors.package$TreeNodeException: 未解決の属性

それぞれ。

4

3 に答える 3

2

DFに変換したら、次のようにデータを簡単に取得できます

  val rddRow= rdd.map(kv=>{
    val k = kv._1
    val v = kv._2
    Row(k, v)
  })

val myFld1 =  StructField("name", org.apache.spark.sql.types.StringType, true)
val myFld2 =  StructField("map", org.apache.spark.sql.types.MapType(StringType, StringType), true)
val arr = Array( myFld1, myFld2)
val schema = StructType( arr )
val rowrddDF = sqc.createDataFrame(rddRow, schema)
rowrddDF.registerTempTable("rowtbl")  
val rowrddDFFinal = rowrddDF.select(rowrddDF("map.one"))
or
val rowrddDFFinal = rowrddDF.select("map.one")
于 2015-09-16T01:24:48.597 に答える
-1

これが私がやったことで、うまくいきました

case class Test(name: String, m: Map[String, String])
val map = Map("hello" -> "world", "hey" -> "there")
val map2 = Map("hello" -> "people", "hey" -> "you")
val rdd = sc.parallelize(Array(Test("first", map), Test("second", map2)))
val rdddf = rdd.toDF
rdddf.registerTempTable("mytable")
sqlContext.sql("select m.hello from mytable").show

結果

+------+
| hello|
+------+
| world|
|people|
+------+
于 2016-06-06T18:00:42.870 に答える