簡體   English   中英

如何將帶有double數組的文件轉換為spark中的dataframe?

[英]How to convert file with array of double to dataframe in spark?

我是Scala和Apache Spark的新手。 我的文本文件包含以下條目:

[-0.9704851405656525,1.0286638765434661]
[-0.9704851405656525,1.0286638765434661]
[-1.0353873234576638,-0.001849782262230898]
[-0.9704851405656525,1.0286638765434661]
[-0.9704851405656525,1.0286638765434661]
....

我想從中創建數據幀。 要使用sql查詢,我的代碼看起來像這樣,

def processr(str:String) = str.replaceAll("\\[", "").replaceAll("\\]","")
case class Result(a:Double, b:Double)
val filemat = sc.textFile("mat.txt")
val result = filemat.map(s => s.split(',').map(r=>Result(processr(r[0]).toDouble, processr(r[1]).toDouble)).toDF.cache

我得到的錯誤就像,

<console>:1: error: identifier expected but integer literal found.
       val result = filemat.map(s => s.split(',').map(r=>Result(processr(r[0]).toDouble, processr(r[1]).toDouble)).toDF.cache

我不確定,我在代碼中犯了什么錯誤。 看來,我的拆分方法不正確。 任何人都可以建議我進入Dataframes嗎? 提前致謝。

你應該使用圓括號而不是方括號。 從Scala中的數組中提取只是一個apply方法調用:

scala> val r = "[-0.9704851405656525,1.0286638765434661]".split(",")
r: Array[String] = Array([-0.9704851405656525, 1.0286638765434661])

scala> r.apply(0)
res4: String = [-0.9704851405656525

和一些語法糖:

scala> r(0)
res5: String = [-0.9704851405656525

接下來你的地圖看起來不對 當你調用s.split你得到一個Array[String]所以r實際上是一個Stringr(0)給你-或者第一個數字。 你可能想要這樣的東西:

filemat.map(_.split(',') match {
  case Array(s1, s2) => Result(processr(s1).toDouble, processr(s2).toDouble)
})

它可以通過使用正則表達式的模式匹配來簡化:

val p =  "^\\[(-?[0-9]+\\.[0-9]+),(-?[0-9]+\\.[0-9]+)\\]$".r

filemat.map{
   case p(s1, s2) => Result(s1.toDouble, s2.toDouble)
}

或使用Row.fromSeq方法:

val schema = StructType(Seq(
  StructField("a", DoubleType, false),
  StructField("b", DoubleType, false)))

val p1 = "(-?[0-9]+\\.[0-9]+)".r

sqlContext.createDataFrame(filemat.map(s => 
   Row.fromSeq(p1.findAllMatchIn(s).map(_.matched.toDouble).toSeq)), 
   schema)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM