Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在spark中将具有双精度数组的文件转换为数据帧?_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Scala 如何在spark中将具有双精度数组的文件转换为数据帧?

Scala 如何在spark中将具有双精度数组的文件转换为数据帧?,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,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] ...

我对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
:1:错误:需要标识符,但找到整数文本。
val result=filemat.map(s=>s.split(',').map(r=>result(processr(r[0]).toDouble,processr(r[1]).toDouble)).toDF.cache

我不确定我在代码中犯了什么错误。看来,我的拆分方法不正确。有人能建议我如何转换为数据帧吗?提前谢谢。

您应该使用圆括号,而不是方括号。从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
时,你会得到一个
数组[String]
,因此
r
实际上是一个
字符串,而
r(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)
}
或使用
行。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)

“我对Scala和Apache Spark都是新手。”。我不是想成为一个聪明人,而是想在进入之前先学习基础知识?即使花一个小时快速浏览一个基本的Scala教程,然后再浏览另一个Spark教程,也会让你从痛苦和沮丧的世界中解脱出来。Anks zero323,它帮助了我。