2017-11-07 14 views
0

Javaの各要素の型とインデックスを取得する方法を探しています。私は、キーによって削減し、各列のデータ型を見ることができるように例えば、RDDRDDは各要素の型とインデックスを取得します

['0,1,hi,1.0', '2,3,String,String2', '1.0,2.0,3,String'] 

があるとそれから私は

[(0, int),(1, int),(2, String),(3, Double),(0, int) ........] 

をしたいです。私はPythonでそれを達成しましたが、Javaでこれを行う方法についてはわかりません。これを行う方法はありますか?ここで私はどのように私はそれをpythonでやったのですか?

def infer_type(partition): 
for row in partition: 
    value = "" 
    idx = 0 
    for i in range(len(row)): 
     if row[0] == self.prop.comment: 
      break 
     if row[i] == self.prop.delimiter or i == (len(row) - 1): 
      if i == len(row) - 1: 
       value += str(row[i]) 
      if bool(value.strip()) == False: 
       yield (idx, 'None') 
      elif int_regex_match.match(value): 
       yield (idx, 'int') 
      elif float_regex_match.match(value): 
       yield (idx, 'float') 
      else: 
       if date_regex_match.match(value): 
        yield (idx, 'date') 
       else: 
        yield (idx, 'str') 
       idx += 1 
       value = "" 
     else: 
      value += str(row[i]) 
    rdd = rdd.mapPartitions(infer_type).map(lambda x: ((x[0], x[1]), 1)).reduceByKey(add).map(
    lambda x: (x[0][0], (x[0][1], x[1]))) 

EDIT:これは私が今までに得たものです。しかし、私はタプルのイテレータを得ることができません。

PairFlatMapFunction map = new PairFlatMapFunction<Iterator<String>, Integer, String>(){ 

     @Override 
     public Iterator<Tuple2<Integer, String>> call(Iterator<String> iterator) throws Exception { 
      // TODO Auto-generated method stub 
      while(iterator.hasNext()) { 
       String[] row = iterator.next().split(","); 
       for(int j = 0; j<row.length;j++) { 
        if(row[j].matches(int_regex)) { 
         Tuple2<Integer, String> result =new Tuple2(j, "int"); 
         // return iterator of result..? 
        }else if(row[j].matches(float_regex)) { 
         Tuple2<Integer, String> result =new Tuple2(j, "float"); 
         // return iterator of result..? 
        }else if(row[j].matches(date_regex_match)) { 
         Tuple2<Integer, String> result =new Tuple2(j, "date"); 
         // return iterator of result..? 
        }else { 
         Tuple2<Integer, String> result =new Tuple2(j, "str"); 
         // return iterator of result..? 
        } 
       } 
      } 
     } 
}; 
JavaPairRDD pair_rdd = rdd.mapPartitionsToPair(map, false); 

答えて

0

あなたが表現する必要に応じて、マップするのではなくmapPartitionを使用する理由がわかりません。また別の間違いは、mapToPairの代わりにflatMapToPairを使用しなければならないということです。

フラットマップ関数は、文字列(「0,1、hi、1.0」など)をタプルのイテレータにマップする必要があります。あなたが実際にmapPartitionを使用する必要がある場合には

@Override 
public Iterator<Tuple2<Integer, String>> call(String row) throws Exception { 
    String[] split_row = row.split(","); 
    //create list 
    List<Tuple2<Integer, String>> result = new ArrayList<>() 
    for(int j = 0; j<split_row.length;j++) { 
     if(split_row[j].matches(int_regex)) { 
      result.add(new Tuple2(j, "int")); 
     } //else ... 
    } 
    //return the iterator 
    return result.iterator(); 
} 

は、あなたがあなたの関数に同じロジックを適用することができます。これを行うには、あなたは単にあなたが計算結果のArrayListのを作成することができます。

+0

mapPartitionを使用したかったのは、mapPartitionの方が性能が優れているからです。そうじゃない? –

+0

String [] row = iterator.next()。split( "、"); →イテレータはどこから来ていますか? –

+0

私は質問からコードを貼り付けてコピーし、その部分を修正するのを忘れてしまった。私は私の答えを編集しました。ありがとう;-) – Oli

関連する問題