Python Pyspark sc.textFile()不';无法完全加载文件
我从Cloudera quickstart docker容器上的Python Spark(V1.6.0)开始。 我在hdfs中/user/root/access_log.txt下放置了一个静态.txt文件(500 mb),并成功 在pyspark中,我尝试使用以下python代码行加载该文件:Python Pyspark sc.textFile()不';无法完全加载文件,python,hadoop,apache-spark,pyspark,cloudera,Python,Hadoop,Apache Spark,Pyspark,Cloudera,我从Cloudera quickstart docker容器上的Python Spark(V1.6.0)开始。 我在hdfs中/user/root/access_log.txt下放置了一个静态.txt文件(500 mb),并成功 在pyspark中,我尝试使用以下python代码行加载该文件: lines = sc.textFile("hdfs://quickstart.cloudera/user/root/access_log.txt") 这没有给我错误。但是我发现文件没有完全加载。 还有
lines = sc.textFile("hdfs://quickstart.cloudera/user/root/access_log.txt")
这没有给我错误。但是我发现文件没有完全加载。
还有
提供的文件的最后一个元素不正确,而hdfs实际具有正确的文件大小
这是内存问题吗?我的docker设置设置为3840 MB。
我不知道怎么解决这个问题。我期待你的回答
编辑:
我使用以下方法计算数据集中的元素:
lines.count()
令我惊讶的是,这是正确的!这意味着我的文件加载正确。但是问题仍然存在。max()语句为什么不返回正确的元素
这与不同的任务有关吗
编辑2:
.txt文件中的一些示例行
10.190.174.142 - - [03/Dec/2011:13:28:10 -0800] "GET /images/filmpics/0000/2229/GOEMON-NUKI-000163.jpg HTTP/1.1" 200 184976
10.190.174.142 - - [03/Dec/2011:13:28:11 -0800] "GET /images/filmmediablock/360/GOEMON-NUKI-000163.jpg HTTP/1.1" 200 60117
10.190.174.142 - - [03/Dec/2011:13:28:10 -0800] "GET /images/filmmediablock/360/Chacha.jpg HTTP/1.1" 200 109379
10.190.174.142 - - [03/Dec/2011:13:28:11 -0800] "GET /images/filmmediablock/360/GOEMON-NUKI-000159.jpg HTTP/1.1" 200 161657
通常,
max
不应返回(…)最后一个元素。在某些情况下,若日志文件所使用的格式强制执行字典顺序,那个么您很幸运地看到了内容,否则它就不会发生。由于您的数据以IP地址作为前缀,并且使用不友好的(例如ISO 8601)时间戳格式,因此获取最后一个元素不是您所期望的
查找最后一个元素的一种方法是包含索引:
from operator import itemgetter
(rdd
.zipWithIndex() # Add line number to get (line, no)
.max(key=itemgetter(1))[0]) # Compare elements using index
一种稍微不同的方法是为每个分区找到最后一个元素,然后从这些分区中找到最后一个元素
from functools import reduce
rdd.mapPartitions(lambda part: reduce(lambda _, x: [x], part, [])).collect()[-1]
或者,如果分区的数量很大:
(rdd
.mapPartitionsWithIndex(
lambda i, part: reduce(lambda _, x: [(i, x)], part, []))
.max()[1]) # Take max using tuple ordering
嗨,迈克,文件是静态的吗?常规日志文件通常使用最新事件不断更新。这可能是读数与日志不匹配的原因。问得好,但文件是静态的:)
(rdd
.mapPartitionsWithIndex(
lambda i, part: reduce(lambda _, x: [(i, x)], part, []))
.max()[1]) # Take max using tuple ordering