3

WrappedArray<WrappedArray<Double>>を含むDataset<Row>の列があります。この列をUDFに渡して値の1つを取り出します。スパーク取得値形式WrappedArray <WrappedArray <Double>> UDF Java

このネストされた構造のDoublesへのアクセス方法を教えてください。私はこのような何かやりたい

:ここ

sparkSession.udf().register(ADD_START_TOTAL, (UDF1<WrappedArray<WrappedArray<Double>>, Double>) (totals) -> totals[0][1], DataTypes.DoubleType); 

は、列が、私は私のデータセットは以下のように見えるDataset.show()メソッドを呼び出したときにどのように見えるかの例です。

[WrappedArray(2.0... 

編集:この記事How to cast a WrappedArray[WrappedArray[Float]] to Array[Array[Float]] in spark (scala) が、Javaにこれを翻訳する方法がわからないのが見つかりました。

答えて

3

は、あなたのDataset<Row> ds1がスキーマ

root 
|-- value: array (nullable = true) 
| |-- element: array (containsNull = true) 
| | |-- element: double (containsNull = false) 

以下のようなあなたのUDF1関数を定義し、以下でvalue列を持って考えてみましょう。

static UDF1<WrappedArray<WrappedArray<Double>>, List<Double>> getValue = new UDF1<WrappedArray<WrappedArray<Double>>, List<Double>>() { 
public List<Double> call(WrappedArray<WrappedArray<Double>> data) throws Exception { 
     List<Double> doubleList = new ArrayList<Double>(); 
     for(int i=0; i<data.size(); i++){ 
      doubleList.addAll(JavaConversions.seqAsJavaList(data.apply(i))); 
     } 
     return doubleList; 
    } 
} 

今すぐ登録してUDF1のように機能します。

import static org.apache.spark.sql.functions.col; 
import static org.apache.spark.sql.functions.callUDF; 
import scala.collection.JavaConversions; 

// register UDF 
spark.udf().register("getValue", getValue, DataTypes.createArrayType(DataTypes.DoubleType)); 

// Call UDF 
Dataset<Row> ds2 = ds1.select(col("*"), callUDF("getValue", col("value")).as("udf-value")); 
ds2.show(false); 
関連する問題