我在一些文本文件中有大量的数据(大约20 Gig(,我同时拥有所有20 Gig的数据,所以我不想在创建它们时对它们进行部分处理,文本文件中的每一行都指定了一条记录,但这条记录是文本格式的,数据的属性相互连接,这是一个文本文件的示例行:
00000000015tashkhisi---8686745428M.....
前10个字符显示记录编号=>0000000001
位置11处的字符显示记录的类型=>5
接下来的12个字符显示记录的所有者=>tashkhisi-
接下来的10个字符显示所有者的身份=>8686745428
下一个字符显示所有者的性别=>M
等等。。。。。。
这只是一个例子,您可以认为我的记录在实际数据中有100列或属性。
但是,就像大数据中的任何其他输入一样,输入数据中存在噪声,一些记录是不正确的,存在问题,例如,我们可能将++-000001作为记录编号,这是一个无效的记录编号。
现在我想要什么:我想在我的输入数据中找到所有错误,并以这样的聚合方式报告它们:
以tashkhisi作为所有者进行记录->具有总错误的x%
带有性别M的记录->具有总错误的y%
所有者名称中的错误,其中记录类型为5=>250000(合计y%(
记录类型为5时所有者标识出错=>4000000(合计x%(
所有者名称中的错误,其中记录类型为3=>250000(合计k%(
记录类型为3时所有者标识出错=>4000000(总z%(
名称错误总数=>10000000,百分比为6%
等等。。。。
你可以看到属性是相互依赖的,我的程序中需要大量的group by
和substring
,而且我希望报告生成得非常快,输入数据的大小是20Gig,我无法在内存中加载整个数据来处理它们。
我知道我可以使用Spark
、Elasticsearch
和logstash
、mapreduce
等等。但我想知道哪一个更适合做这项特定的任务,为什么?我想知道生成这份报告的最佳方法是什么,有什么工具可以快速生成这份报告吗?请告诉我你建议使用该工具的原因。
您可以使用spark将数据作为数据帧读取,一旦数据帧准备好,您就可以对其执行有效和无效检查,以生成所需的统计信息。
现在棘手的部分是生成数据帧,为此您可以执行以下操作。
df = spark.read.text(r"C:stackoverflowsamplesfixedWidth.txt")
df.select(
df.value.substr(1,10).alias('RecordNumber'),
df.value.substr(11,1).alias('Type'),
df.value.substr(12,12).alias('Owner'),
df.value.substr(24,10).alias('identity'),
df.value.substr(34,1).alias('gender')
).show()
+------------+----+------------+----------+------+
|RecordNumber|Type| Owner| identity|gender|
+------------+----+------------+----------+------+
| 0000000001| 5|tashkhisi---|8686745428| M|
| ++--000001| 5|tashkhisi---|8686745428| M|
| _+00000001| 5|tashkhisi---|++86745428| M|
| 0000000001| 5|tashkhisi---|8686745428| M|
| 0000000001| 5|tashkhisi---|8686745428| M|
| 0000000001| 5|tashkhisi---|8686745428| M|
| 0000000001| 5|tashkhisi---|8686745428| M|
+------------+----+------------+----------+------+
现在,从这个数据帧中,有多个机会,你可以只使用spark直接生成统计数据,或者如果你有一个活动的ES集群,然后加载到ES(不推荐(
如果您的数据是json结构的,并且您希望在数据集上具有快速搜索功能,那么ES是很好的。对于聚合和所有ES提供近似结果。