2016-11-22 16 views
5

Dataset<Row> của cột duy nhất của chuỗi json:phân tích Dataset cột của Json to DataSet <Row>

+--------------------+ 
|    value| 
+--------------------+ 
|{"Context":"00AA0...| 
+--------------------+ 

Json mẫu:

{"Context":"00AA00AA","MessageType":"1010","Module":"1200"} 

Làm thế nào tôi có thể có hiệu quả nhất được Dataset<Row> trông như thế này:

+--------+-----------+------+ 
| Context|MessageType|Module| 
+--------+-----------+------+ 
|00AA00AA|  1010| 1200| 
+--------+-----------+------+ 

Tôi đang xử lý dữ liệu đó trong liên kết am, tôi biết rằng tia lửa có thể tự làm điều này khi tôi đọc nó từ một tệp:

spark 
.readStream() 
.schema(MyPojo.getSchema()) 
.json("src/myinput") 

nhưng bây giờ tôi đang đọc dữ liệu từ kafka và nó cho tôi dữ liệu ở dạng khác. Tôi biết rằng tôi có thể sử dụng một số trình phân tích cú pháp như Gson, nhưng tôi muốn để tia lửa làm điều đó cho tôi.

Trả lời

1

Hãy thử mẫu này.

public class SparkJSONValueDataset { 
    public static void main(String[] args) { 
     SparkSession spark = SparkSession 
       .builder() 
       .appName("SparkJSONValueDataset") 
       .config("spark.sql.warehouse.dir", "/file:C:/temp") 
       .master("local") 
       .getOrCreate(); 

     //Prepare data Dataset<Row> 
     List<String> data = Arrays.asList("{\"Context\":\"00AA00AA\",\"MessageType\":\"1010\",\"Module\":\"1200\"}"); 
     Dataset<Row> df = spark.createDataset(data, Encoders.STRING()).toDF().withColumnRenamed("_1", "value"); 
     df.show(); 

     //convert to Dataset<String> and Read 
     Dataset<String> df1 = df.as(Encoders.STRING()); 
     Dataset<Row> df2 = spark.read().json(df1.javaRDD()); 
     df2.show(); 
     spark.stop(); 
    } 
} 
+0

ty cho câu trả lời của bạn. đoán rằng điều này sẽ làm việc nhưng tôi thực sự không thích ý tưởng gửi DF của tôi một lần nữa để đọc :( –

Các vấn đề liên quan