2017-02-25 14 views
5

Mam Dataset<Tuple2<String,DeviceData>> i chcę go przetransformować na Iterator<DeviceData>.Jak przekształcić zestaw danych <Tuple2 <String, DeviceData >> na Iterator <DeviceData>

Poniżej znajduje się mój kod, w którym używam metody collectAsList(), a następnie otrzymuję 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(); 

Nie mogę korzystać collectAsList() jak moje dane jest ogromny i będzie to utrudniać działanie. Sprawdziłem interfejs API zestawu danych, ale nie mogłem znaleźć rozwiązania. Przeszukałem go, ale nie znalazłem żadnej odpowiedzi. Czy ktoś może mnie poprowadzić? Jeśli rozwiązanie jest w języku Java, będzie świetnie. Dzięki.

EDIT:

DeviceData klasa jest prosta JavaBeans. Oto wynik printSchema() dla ds.

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

Odpowiedz

1

można bezpośrednio wyodrębnić DeviceData z ds zamiast ponownie zbierając i budynek.

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) 
Powiązane problemy