- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的代码将字符串列表分组为类型 List[(String, List[String])]在长度为 5 的 String 中遇到所有大写的地方,这就是标识符,标识符后面的所有数据都被分组到一个列表中。每个组的终止因素是遇到空行。所以下面的“行”被转换为:
(IDENT,List(p1text, p2text))
(IDENY,List(p2text, p3text, p4text))
在 Scala/Spark 中是否有更惯用的方法来实现这一点? 可能使用带有谓词的 groupBy
调用?
理想情况下,数据结构的类型应该是 RDD[(String, List[String])] 而不是 List[(String, List[String])]
val lines = List[String]("line1",
" ",
"line2",
" ",
" IDENT",
"p1text",
"p2text",
" ",
" IDENY",
"p2text",
"p3text",
"p4text",
" ",
"some text") //> lines : List[String] = List(line1, "
//|
//|
//| ", line2, "
//|
//|
//| ", " IDENT", p1text, p2text, "
//|
//|
//| ", " IDENY", p2text, p3text, p4text, "
//| ", some text)
def getItems(i: Int): List[String] = {
var iter = i;
val l = new scala.collection.mutable.ArrayBuffer[String]()
while (!lines(iter).trim.isEmpty) {
iter = iter + 1
if(!lines(iter).trim.isEmpty)
l.append(lines(iter).trim)
}
l.toList
} //> getItems: (i: Int)List[String]
val regex = "\\w{5}" //> regex : String = \w{5}
val u: List[(String , List[String])] = lines.zipWithIndex.map({
case (s, i) => {
if (s.trim.toUpperCase.matches(regex)) {
(s.trim, getItems(i))
} else {
("" , List())
}
}
}) //> u : List[(String, List[String])] = List((line1,List()), ("",List()), (line
//| 2,List()), ("",List()), (IDENT,List(p1text, p2text)), ("",List()), ("",List
//| ()), ("",List()), (IDENY,List(p2text, p3text, p4text)), ("",List()), ("",Li
//| st()), ("",List()), ("",List()), ("",List()))
val fi : List[(String, List[String])] = u.filterNot(f => f._2.isEmpty || f._2(0).trim.isEmpty)
//> fi : List[(String, List[String])] = List((IDENT,List(p1text, p2text)), (ID
//| ENY,List(p2text, p3text, p4text)))
fi.foreach(println) //> (IDENT,List(p1text, p2text))
//| (IDENY,List(p2text, p3text, p4text))
最佳答案
您可以从在 Scala 中编写拆分的惯用方法开始:作为递归函数。
def getItems(l: List[String]): List[(String, List[String])] = {
if (l.isEmpty) List()
else {
val caps = "[A-Z]+".r
val (beg, end) = l.span(_.trim.nonEmpty)
if (beg.nonEmpty)
beg.head.trim match {
case caps() => (beg.head.trim, beg.tail) :: getItems(end.drop(1))
case _ => getItems(end.drop(1))
}
else
getItems(end.tail)
}
}
然后你可以通过使它成为一个尾递归函数来加速它。
import scala.annotation.tailrec
def getItemsFast(l: List[String]): List[(String, List[String])] = {
@tailrec
def getItemsAux(l: List[String], res: List[(String, List[String])]): List[(String, List[String])] = {
if (l.isEmpty) res.reverse
else {
val caps = "[A-Z]+".r
val (beg, end) = l.span(_.trim.nonEmpty)
if (beg.nonEmpty)
beg.head.trim match {
case caps() => getItemsAux(end.drop(1), (beg.head.trim, beg.tail)::res)
case _ => getItemsAux(end.drop(1), res)
}
else
getItemsAux(end.tail, res)
}
}
getItemsAux(l,List())
}
然后,如果您有行的 RDD,在 Spark 中检索它的简单方法(但不正确,见下文)是在您的 RDD 上mapPartition
。
myRDDOfLines.mapPartitions(lines => {
getItemsFast(lines)
})
这应该大部分工作,但是这将无法注意到已分区的记录,例如标识符位于一个分区中,但一些“它的”行在下一个分区中尾随。
错误在于您将记录构建为可分区单元的方式:您真正想要的是记录的 RDD(一条记录是上面输出列表的一个元素,应该清楚键和值应该是什么) .这不是 sc.textFile
给你的。有很多方法可以更好地将数据加载到 Spark 中。例如,您可以:
wholeTextFiles
TextInputFormat
和 RecordReader
hadoop.Configuration
对象提供分隔符。 ..关于scala - 使用 Scala/Apache Spark 对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27963221/
我有一些 Scala 代码,它用两个不同版本的类型参数化函数做了一些漂亮的事情。我已经从我的应用程序中简化了很多,但最后我的代码充满了形式 w(f[Int],f[Double]) 的调用。哪里w()是
如果我在同一目录中有两个单独的未编译的 scala 文件: // hello.scala object hello { def world() = println("hello world") }
val schema = df.schema val x = df.flatMap(r => (0 until schema.length).map { idx => ((idx, r.g
环境: Play 2.3.0/Scala 2.11.1/IntelliJ 13.1 我使用 Typesafe Activator 1.2.1 用 Scala 2.11.1 创建一个新项目。项目创建好后
我只是想知道如何使用我自己的类扩展 Scala 控制台和“脚本”运行程序,以便我可以通过使用实际的 Scala 语言与其通信来实际使用我的代码?我应将 jar 放在哪里,以便无需临时配置即可从每个 S
我已经根据 README.md 文件安装了 ensime,但是,我在低级 ensime-server 缓冲区中出现以下错误: 信息: fatal error :scala.tools.nsc.Miss
我正在阅读《Scala 编程》一书。在书中,它说“一个函数文字被编译成一个类,当在运行时实例化时它是一个函数值”。并且它提到“函数值是对象,因此您可以根据需要将它们存储在变量中”。 所以我尝试检查函数
我有 hello world scala native 应用程序,想对此应用程序运行小型 scala 测试我使用通常的测试命令,但它抛出异常: NativeMain.scala object Nati
有few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建
我是 Scala 的新手。但是,我用 创建了一个中等大小的程序。斯卡拉 2.9.0 .现在我想使用一个仅适用于 的开源库斯卡拉 2.7.7 . 是吗可能 在我的 Scala 2.9.0 程序中使用这个
有没有办法在 Scala 2.11 中使用 scala-pickling? 我在 sonatype 存储库中尝试了唯一的 scala-pickling_2.11 工件,但它似乎不起作用。我收到消息:
这与命令行编译器选项无关。如何以编程方式获取代码内的 Scala 版本? 或者,Eclipse Scala 插件 v2 在哪里存储 scalac 的路径? 最佳答案 这无需访问 scala-compi
我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。 这是我的 Rational 类的初始版本(基于本书) class Rational(numerato
我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库内创建了一个mysql连接池。这是我的库的build.sbt organization := "com.learn" name :
我正在尝试运行一些 Scala 代码,只是暂时打印出“Hello”,但我希望在 SBT 项目中编译 Scala 代码之前运行 Scala 代码。我发现在 build.sbt 中有以下工作。 compi
Here链接到 maven Scala 插件使用。但没有提到它使用的究竟是什么 Scala 版本。我创建了具有以下配置的 Maven Scala 项目: org.scala-tools
我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结
我有一个 scala 宏,它依赖于通过包含其位置的静态字符串指定的任意 xml 文件。 def myMacro(path: String) = macro myMacroImpl def myMacr
这是我的功能: def sumOfSquaresOfOdd(in: Seq[Int]): Int = { in.filter(_%2==1).map(_*_).reduce(_+_) } 为什么我
这个问题在这里已经有了答案: Calculating the difference between two Java date instances (45 个答案) 关闭 5 年前。 所以我有一个这
我是一名优秀的程序员,十分优秀!