2017-02-25 37 views
5

Nasıl Dataset<Tuple2<String,DeviceData>> var ve Iterator<DeviceData> için dönüştürmek istiyorum.Nasıl Dataset <Tuple2 <String, DeviceData >> Dönüştürücüsü Iterator <DeviceData>

Aşağıda, collectAsList() yöntemini kullanıyorum ve Iterator<DeviceData> aldığım kodumu aşağıda bulabilirsiniz.

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(); 

verilerim büyük olduğu gibi collectAsList() kullanamaz ve performans engel olacaktır. Dataset API'sine baktım ama herhangi bir çözüm bulamadım. Ben googled ama herhangi bir cevap bulamadık. Birisi bana rehberlik edebilir mi? Eğer çözüm javada ise harika olacak. Teşekkürler.

DÜZENLEME:

DeviceData sınıf basit javabean olduğunu. İşte ds için printSchema() çıkışı.

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

cevap

1

doğrudan yerine tekrar toplanması ve bina içinde ds den DeviceData çıkarabilir.

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)