使用 Spark 和 Scala 过滤掉任何无法正确解析的记录

Posted

技术标签:

【中文标题】使用 Spark 和 Scala 过滤掉任何无法正确解析的记录【英文标题】:Filtering out any records which do not parse correctly using Spark and Scala 【发布时间】:2016-04-09 03:36:23 【问题描述】:

我有一个包含多行的 txt 文件。请参阅下面 2 行的示例:

2014-03-15:10:10:20,Sorrento F41L,8cc3b47e-bd01-4482-b500-28f2342679af,7,24,39,enabled,disabled,connected,55,67,12,33.6894754264,-117.543308253
2014-03-15:10:10:20|MeeToo 1.0|ef8c7564-0a1a-4650-a655-c8bbd5f8f943|0|31|63|70|39|27|enabled|enabled|enabled|37.4321088904|-121.485029632

如您所见,第一行以逗号分隔,而第二行以竖线分隔。该文件包含很多行,其中一些是逗号分隔的,另一些是竖线分隔的。

我需要做的是过滤掉任何无法正确解析的记录(即,每个正确解析的记录/行应该正好有 14 个值/字段)

首先我使用 sc.textFile("/path/filename.txt") 读取文件,但我不知道如何继续。

【问题讨论】:

管道和逗号分隔的行都是值吗?逗号可以出现在管道分隔的行中,管道出现在逗号分隔的行中吗?基本上你需要通过“正确解析”来定义你的意思。 不,逗号不会出现在管道分隔的行中,管道也不会出现在逗号分隔的行中。 所以您可以在[|,] 上拆分,然后按照@stevewaldram 的答案计算字段。 没错,我已经这样做了。非常感谢,它工作正常。 【参考方案1】:

可能是这样的

sc.textFile("/path/filename.txt").map( _.split("[|,]") ).filter( _.length == 14 )

【讨论】:

以上是关于使用 Spark 和 Scala 过滤掉任何无法正确解析的记录的主要内容,如果未能解决你的问题,请参考以下文章

从 Kafka 主题读取数据处理数据并使用 scala 和 spark 写回 Kafka 主题

使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]

有没有办法使用scala过滤不包含spark数据框中某些内容的字段?

无法过滤存储在 spark 2.2.0 数据框中的 CSV 列

过滤计数等于输入文件 rdd Spark 的列

Spark Scala:如何在 LIKE 语句中使用通配符作为文字