web-dev-qa-db-ja.com

Spark JSONテキストフィールドからRDDへ

JSONオブジェクトを含むsnapshotという名前のテキストタイプのフィールドを持つcassandraテーブルがあります:

[identifier, timestamp, snapshot]

Sparkを使用してそのフィールドで変換を実行できるようにするには、そのRDDのそのフィールドを別のRDDに変換して、JSONスキーマで変換を行う必要があることを理解しました。

あれは正しいですか?どうすればそれに進むことができますか?

編集:今のところ、私は単一のテキストフィールドからRDDを作成することができました:

val conf = new SparkConf().setAppName("signal-aggregation")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val snapshots = sc.cassandraTable[(String, String, String)]("listener", "snapshots")
val first = snapshots.first()
val firstJson = sqlContext.jsonRDD(sc.parallelize(Seq(first._3)))
firstJson.printSchema()

これは私にJSONスキーマを示しています。良い!

各行からそのスナップショットフィールドのRDDを取得するには、このスキーマをテーブルスナップショットのすべての行に適用する必要があることをSparkに伝えるにはどうすればよいですか?

8
galex

ほぼそこに、jsonを含むRDD [String]をjsonRDDメソッドに渡したいだけです。

val conf = new SparkConf().setAppName("signal-aggregation")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val snapshots = sc.cassandraTable[(String, String, String)]("listener", "snapshots")
val jsons = snapshots.map(_._3) // Get Third Row Element Json(RDD[String]) 
val jsonSchemaRDD = sqlContext.jsonRDD(jsons) // Pass in RDD directly
jsonSchemaRDD.registerTempTable("testjson")
sqlContext.sql("SELECT * FROM testjson where .... ").collect 

簡単な例

val stringRDD = sc.parallelize(Seq(""" 
  { "isActive": false,
    "balance": "$1,431.73",
    "picture": "http://placehold.it/32x32",
    "age": 35,
    "eyeColor": "blue"
  }""",
   """{
    "isActive": true,
    "balance": "$2,515.60",
    "picture": "http://placehold.it/32x32",
    "age": 34,
    "eyeColor": "blue"
  }""", 
  """{
    "isActive": false,
    "balance": "$3,765.29",
    "picture": "http://placehold.it/32x32",
    "age": 26,
    "eyeColor": "blue"
  }""")
)
sqlContext.jsonRDD(stringRDD).registerTempTable("testjson")
csc.sql("SELECT age from testjson").collect
//res24: Array[org.Apache.spark.sql.Row] = Array([35], [34], [26])
13
RussS