2017-02-25 16 views
5

Tôi có Dataset<Tuple2<String,DeviceData>> và muốn chuyển đổi thành Iterator<DeviceData>.Cách chuyển đổi Tập dữ liệu <Tuple2 <Chuỗi, DeviceData >> thành Iterator <DeviceData>

Dưới đây là mã của tôi nơi tôi đang sử dụng phương pháp collectAsList() và sau đó nhận được Iterator<DeviceData>.

Dataset<Tuple2<String,DeviceData>> ds = ...; 
List<Tuple2<String, DeviceData>> listTuple = ds.collectAsList(); 

ArrayList<DeviceData> myDataList = new ArrayList<DeviceData>(); 
for(Tuple2<String, DeviceData> tuple : listTuple){ 
    myDataList.add(tuple._2()); 
} 

Iterator<DeviceData> myitr = myDataList.iterator(); 

Tôi không thể sử dụng collectAsList() vì dữ liệu của tôi rất lớn và sẽ cản trở hiệu suất. Tôi đã xem API Dataset nhưng không thể nhận được bất kỳ giải pháp nào. Tôi googled nó nhưng không thể tìm thấy bất kỳ câu trả lời. Ai đó có thể hướng dẫn tôi không? Nếu giải pháp là trong java đó sẽ là tuyệt vời. Cảm ơn.

EDIT:

DeviceData lớp là đơn giản JavaBean. Đây là đầu ra printSchema() cho ds.

root 
|-- value: string (nullable = true) 
|-- _2: struct (nullable = true) 
| |-- deviceData: string (nullable = true) 
| |-- deviceId: string (nullable = true) 
| |-- sNo: integer (nullable = true) 

Trả lời

1

Bạn có thể trích xuất trực tiếp DeviceData từ ds thay vì thu thập và xây dựng lại.

Java:

Function<Tuple2<String, DeviceData>, DeviceData> mapDeviceData = 
    new Function<Tuple2<String, DeviceData>, DeviceData>() { 
     public DeviceData call(Tuple2<String, DeviceData> tuple) { 
     return tuple._2(); 
     } 
    }; 

Dataset<DeviceData> ddDS = ds.map(mapDeviceData) //extracts DeviceData from each record 

Scala:

val ddDS = ds.map(_._2) //ds.map(row => row._2) 
Các vấn đề liên quan