2017-07-12 11 views
0

列の1つがのリストのリストを含むR data.frameを持っています。つまり、各要素には整数のリストが埋め込まれています。 SparkRはエラーを返していますが、このdata.frameをSparkR DataFrameに変換したいと思います。ここでRのリストを要素とするSparkRデータフレーム

は、問題を与える例のRのdata.frameを作成する方法は次のとおりです。myDfを見て

indices <- 1:4 
myDf <- data.frame(indices) 
myDf$data <- list(rep(0, 20)) 

は(私が期待するよう)次を与える:

> str(myDf) 
'data.frame': 4 obs. of 2 variables: 
$ indices: int 1 2 3 4 
$ data :List of 4 
    ..$ : num 0 0 0 0 0 0 0 0 0 0 ... 
    ..$ : num 0 0 0 0 0 0 0 0 0 0 ... 
    ..$ : num 0 0 0 0 0 0 0 0 0 0 ... 
    ..$ : num 0 0 0 0 0 0 0 0 0 0 ... 

> head(myDf) 
    indices              data 
1  1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
2  2 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
3  3 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
4  4 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 

と作成しますSparkR DataFrameは実際にはエラーなしで実行されます:

library(SparkR, lib.loc=paste0(Sys.getenv("SPARK_HOME"),"/R/lib")) 
sparkR.session(master = "local[*]") 

mySparkDf <- as.DataFrame(myDf) 

ただし、後続のoper mySparkDf上ationsが動作していないようです:

> collect(mySparkDf) 
17/07/13 17:23:00 ERROR executor.Executor: Exception in task 0.0 in stage 1.0 (TID 1) 
java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: 
java.lang.Double is not a valid external type for schema of array<double> 
if (assertnotnull(input[0, org.apache.spark.sql.Row, true]).isNullAt) null 
else validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, indices), IntegerType) AS indices#0 
... long stack trace ... 

スパークdocumentationによると、リストは実際には許可すべきですか?

> schema(mySparkDf) 
StructType 
|-name = "indices", type = "IntegerType", nullable = TRUE 
|-name = "data", type = "ArrayType(DoubleType,true)", nullable = TRUE 

スパーク2.2.0、R 3.4.0、Javaの1.8.0_131を使用する:偶数データフレームがリストが(正常)のArrayTypeとして格納されていることを示しているスパークのスキーマを見

アイデア?助けを前にありがとう!

答えて

0

私は

Error in structField.character(names[[i]], types[[i]], TRUE) : 
    Field type must be a string. 

をsparkdataframe.ieするために変換しながら実行した後、私はmyDfがsparkdataframeに変換するカントと思うエラーが発生しました。このコードを試してみました。 このようにmySparkDf < - as.DataFrame(myDf $ data)を変換することができます。 希望の出力が得られません。

+0

ありがとうございました。これはSparkに機能要求を送信する問題だとお考えですか? – neilalex

0

私はRでデータを正規化する必要があると思います。 @midhunxavierと同じエラーが発生しています。配列型doubleはspark rの問題です。最初にデータを正規化するためにRでpurrパッケージを使用することを検討しましたか?参考になるリンクがあります:https://jennybc.github.io/purrr-tutorial/ls13_list-columns.html

+0

ありがとうございました。はい、実際には私の回避策は、すべてのリスト要素をdata.frameの独自の列に移動することです。しかし、データが半構造化されているので、埋め込みリストを維持する方がずっと便利です...あなたは "アレイタイプのダブルは火花rのトラブルです"と言う...それはバグですか? – neilalex

+0

私は 'array'型が現時点でSparkRでサポートされているとは思っていません...ダブルスや文字列などで構成される配列なのでしょうか?しかし、データフレームをJSONに変換してからSparkR 2.2.0+に読み込んで、 'as.json.array'オプションを使用すると、これに対処する方法があると思います。 https://github.com/apache/spark/blob/master/R/pkg/R/functions.Rの2174行目を覗いてみてください.jsonコマンドからはここを助けることができますが、私は100ではありません%確実です。私はあなたをどこにも送り届けたくないかもしれませんが、おそらく助けてくれるかもしれません... – nate

+0

クール、感謝します。 – neilalex

関連する問題