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)
})
})