Sur*_*iya 3 scala dataframe apache-spark apache-spark-sql
我是Scala和Apache Spark的新手.我的文本文件包含以下条目:
[-0.9704851405656525,1.0286638765434661]
[-0.9704851405656525,1.0286638765434661]
[-1.0353873234576638,-0.001849782262230898]
[-0.9704851405656525,1.0286638765434661]
[-0.9704851405656525,1.0286638765434661]
....
Run Code Online (Sandbox Code Playgroud)
我想从中创建数据帧.要使用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
Run Code Online (Sandbox Code Playgroud)
我得到的错误就像,
<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
Run Code Online (Sandbox Code Playgroud)
我不确定,我在代码中犯了什么错误.看来,我的拆分方法不正确.任何人都可以建议我进入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
Run Code Online (Sandbox Code Playgroud)
和一些语法糖:
scala> r(0)
res5: String = [-0.9704851405656525
Run Code Online (Sandbox Code Playgroud)
接下来你的地图看起来不对 当你打电话s.split
你得到一个Array[String]
这样r
实际上是一个String
并r(0)
为您提供了两种-
或第一位.你可能想要这样的东西:
filemat.map(_.split(',') match {
case Array(s1, s2) => Result(processr(s1).toDouble, processr(s2).toDouble)
})
Run Code Online (Sandbox Code Playgroud)
它可以通过使用正则表达式的模式匹配来简化:
val p = "^\\[(-?[0-9]+\\.[0-9]+),(-?[0-9]+\\.[0-9]+)\\]$".r
filemat.map{
case p(s1, s2) => Result(s1.toDouble, s2.toDouble)
}
Run Code Online (Sandbox Code Playgroud)
或使用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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6191 次 |
最近记录: |