Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Spark Dataframe_Optional - Fatal编程技术网

Scala spark数据帧句柄选项某些无

Scala spark数据帧句柄选项某些无,scala,apache-spark,spark-dataframe,optional,Scala,Apache Spark,Spark Dataframe,Optional,与之类似,我有一个通过df.mapPartitions def mapToTopics(iterator: Iterator[RawRecords]): Iterator[TopicContent] = { iterator.map(k => { browser.parseString(k.content) >> elementList("doc").map(d => { TopicContent((d >> text("d

与之类似,我有一个通过
df.mapPartitions

def mapToTopics(iterator: Iterator[RawRecords]): Iterator[TopicContent] = {
    iterator.map(k => {
      browser.parseString(k.content) >> elementList("doc").map(d => {
        TopicContent((d >> text("docno")).head, (d >> text("text")).head, k.path)
      })
    })
  }
还定义了以下内容:

@transient lazy val browser = JsoupBrowser()
case class TopicContent(topic: String, content: String, filepath: String)
case class RawRecords(path: String, content: String)
如果不存在带文本的xml标记(对于某些格式错误的文档,这种情况会发生),则上面的操作将抛出错误(
NoSuchElementException
) 如何更正和简化此代码以正确处理选项

当尝试使用util时,请按照上面的链接所述进行尝试,并应用
flatMap
my code将失败,因为它使用的不是
Element
,而是
Char

编辑 很遗憾,将只返回一个
选项[无]

编辑4 没有火花的最小样本(以及下面的完整代码)

import net.ruippeixotg.scalascraper.browser.JsoupBrowser
导入net.ruippeixotg.scalascraper.dsl.dsl.Extract_
导入net.ruippeixotg.scalascraper.dsl.dsl_
导入net.ruippeixotg.scalascraper.scraper.ContentExtractors.elementList
@瞬态惰性val browser=JsoupBrowser()
瓦尔·布罗克=
"""
|
|LA051089-0001
| 
| 
|   54901
| 
| 
|1989年5月10日,星期三,家庭版

| | |地铁;第2部分;第2页;第2栏

| | |照片,多云晴朗一个风雨交加的下午,清晰地看到了洛杉矶的天际线,仍在耸立的图书馆大楼矗立在其配套建筑之上。肯·卢巴斯/洛杉矶时报

| | |野生艺术

| “.stripMargin” val正确= """ | |FR940104-0-00001 |FR940104-0-00001 | | | | | | | | | | | |联邦公报 | | | |␣/␣第59卷第2期␣/␣1994年1月4日,星期二␣/␣规章制度 | | | | | | |第59卷第2期 | | | | | |一九九四年一月四日(星期二) | | | | | | | | | | | “.stripMargin” 案例类原始记录(路径:字符串,内容:字符串) 案例类TopicContent(主题:String,内容:String,文件路径:String) val raw=序列(原始记录(“第一”,正确),原始记录(“第二”,断开)) val result=mapToTopics(原始迭代器) //变式1 def mapToTopics(迭代器:迭代器[RawRecords]):迭代器[TopicContent]={ 迭代器.flatMap(k=>{ val documents=browser.parseString(k.content)>>elementList(“doc”) documents.map(d=>{ val docno=d>>文本(“docno”) //试一试{ val textContent=d>>文本(“文本”) 主题内容(docno、textContent、k.path) //}捕获{ //案例:NoSuchElementException=>TopicContent(docno,None,k.path) // } })//.filter(u.content!=无) }) } //进一步细分后,您会看到以下内容将生成字符串选项 browser.parseString(原始(0.content)>>elementList(“doc”).map(d=>{ val docno=d>>文本(“docno”) val textContent=d>>文本(“文本”) (docno.headOption,textContent.headOption) }) //而下面将映射到角色。这里怎么了? val documents=browser.parseString(原始(0.content)>>elementList(“doc”) documents.map(d=>{ val docno=d>>文本(“docno”) val textContent=d>>文本(“文本”) (docno.headOption,textContent.headOption) })
我不熟悉您正在使用的API,但是在
for
理解中使用
headOpton
可能会帮助您:

import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._

iterator.map(k => {
      browser.parseString(k.content) >> elementList("doc").flatMap(d => {
        for {
           docno <- text("docno")).headOption
           text <- (d >> text("text")).headOption
        } yield TopicContent(docno, text, k.path)
      })
})
import net.ruippeixotg.scalascraper.dsl.dsl_
导入net.ruippeixotg.scalascraper.dsl.dsl.Extract_
导入net.ruippeixotg.scalascraper.dsl.dsl.Parse_
迭代器.map(k=>{
browser.parseString(k.content)>>elementList(“doc”).flatMap(d=>{
为了{
文档号文本(“文本”)。标题选项
}产生主题内容(文档号、文本、k.path)
})
})

这样,当
docno
text
都存在时,您只构建
TopicContent
,实际上是
Some(TopicContent)
,反之则是
None
。然后
flatMap
删除所有
None
并提取
部分
中的内容,留下一组为所有有效XML创建的
TopicContent
实例。

我不熟悉您正在使用的API,但在
for
理解中使用
headOpton
可能有助于您:

import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._

iterator.map(k => {
      browser.parseString(k.content) >> elementList("doc").flatMap(d => {
        for {
           docno <- text("docno")).headOption
           text <- (d >> text("text")).headOption
        } yield TopicContent(docno, text, k.path)
      })
})
import net.ruippeixotg.scalascraper.dsl.dsl_
导入net.ruippeixotg.scalascraper.dsl.dsl.Extract_
导入net.ruippeixotg.scalascraper.dsl.dsl.Parse_
迭代器.map(k=>{
browser.parseString(k.content)>>elementList(“doc”).flatMap(d=>{
为了{
文档号文本(“文本”)。标题选项
}产生主题内容(文档号、文本、k.path)
})
})

这样,当
docno
text
都存在时,您只构建
TopicContent
,实际上是
Some(TopicContent)
,反之则是
None
。然后
flatMap
删除所有
None
并提取
Some
中的内容,留下一组为所有有效XML创建的
TopicContent
实例。

这两个示例之间的区别在于运算符的优先级。在执行
browser.parseString(raw(0).content)>>elementList(“doc”).map(…)
时,您调用的是
elementList(“doc”)
上的
map
,而不是整个表达式。为了使第一个示例的行为与第二个示例相同,您需要编写
(browser.parseString(raw(0.content)>>elementList(“doc”)).map(…)
(推荐)或
browser.parseString(raw(0.content)>>elementList(“doc”)map(…)

在您正在使用的scala scraper库的上下文中,这两个表达式的含义非常不同。使用
browser.parseString(原始(0.content)>>elementList(“doc”)
从文档中提取
List[Element]
,然后调用
import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._

iterator.map(k => {
      browser.parseString(k.content) >> elementList("doc").flatMap(d => {
        for {
           docno <- text("docno")).headOption
           text <- (d >> text("text")).headOption
        } yield TopicContent(docno, text, k.path)
      })
})