11

org.apache.spark.sql.catalyst.expressions.Rowユーザー入力に基づいて行 () を作成しようとしています。行をランダムに作成できません。

またはから行を作成する機能はありますListArray

たとえば.csv、次の形式のファイルがある場合、

"91xxxxxxxxxx,21.31,15,0,0"

ユーザー入力の場合、最初の列である[1, 2]2 列目と 3 列目のみを取得する必要がありますcustomer_id

私はコードでそれを解析しようとします:

val l3 = sc.textFile("/SparkTest/abc.csv").map(_.split(" ")).map(r => (foo(input,r(0)))) `

ここで、foo は次のように定義されます。

def f(n: List[Int], s: String) : Row = {
    val n = input.length
    var out = new Array[Any](n+1)
    var r = s.split(",")
    out(0) = r(0)
    for (i <- 1 to n)
        out(i) = r(input(i-1)).toDouble
    Row(out)
}

入力はリストです

val input = List(1,2)

このコードを実行すると、l3 が次のように取得されます。

Array[org.apache.spark.sql.Row] = Array([[Ljava.lang.Object;@234d2916])

しかし、私が欲しいのは:

Array[org.apache.spark.sql.catalyst.expressions.Row] = Array([9xxxxxxxxxx,21.31,15])`

これは、Spark SQL でスキーマを作成するために渡す必要があります

4

3 に答える 3

18

次のようなものが機能するはずです。

import org.apache.spark.sql._

def f(n: List[Int], s: String) : Row =
  Row.fromSeq(s.split(",").zipWithIndex.collect{case (a,b) if n.contains(b) => a}.toSeq)
于 2015-01-23T14:26:38.097 に答える