Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/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
Python Pyspark sc.textFile()不';无法完全加载文件_Python_Hadoop_Apache Spark_Pyspark_Cloudera - Fatal编程技术网

Python Pyspark sc.textFile()不';无法完全加载文件

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") 这没有给我错误。但是我发现文件没有完全加载。 还有

我从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")
这没有给我错误。但是我发现文件没有完全加载。 还有

提供的文件的最后一个元素不正确,而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