对于Spark和整个生态系统我还是很陌生,所以对于启动错误来说我很愚蠢,但是我发现并没有发布支持或类似问题。
我在S3存储桶上有很多数据(TB),这些数据被拆分为子目录中的数千个100Mb镶木地板文件。目前,我只想查询一个文件并选择一些行。我在学习时正在使用PySpark在本地运行spark(3.0):
代码如下:
spark = SparkSession.builder \
.master("local") \
.appName("Test") \
.getOrCreate()
path = "s3a://BUCKET_NAME/DIR/FILE.gz.parquet"
df = spark.read.parquet(path)
df.printSchema() # this works
df.show(n=10) # this works
df.orderBy("sessionID").show(n=5) # this works
df.select("sessionID").show(n=5) # this fails
OrderBy可以正常工作,并快速显示按名称排序的前5个。但是,选择查询失败并显示:
19/09/13 01:16:28 ERROR TaskContextImpl: Error in TaskCompletionListener
org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 74915373; received: 45265606
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:178)
因此,我相信选择操作不会从S3存储桶中接收全部数据,但是我该怎么办?为什么OrderBy可以工作?
以下问题有点开放。数据被组织成需要一次性处理的会话。但是,每个会话的行分散在每个镶木文件和数百个镶木文件中,这意味着必须遍历数百GB才能组成一个完整的会话。因此,我希望Spark按会话ID排序。该处理将由单独的C ++库完成,因此我将不得不通过管道将会话数据输出。在本地计算机上处理整个数据集将非常困难,但是我可以应用一些选择来将数据减少到50Gb之类,我希望可以在功能强大的工作站(32core,64Gb)上花费数小时来完成。这可行吗?设计外观如何?抱歉,这很模糊,但是Spark示例在很小的JSON上非常简单,或者具有丰富的知识,因此很难从前者过渡到后者。
答案 0 :(得分:0)
在花费了数小时之后,经历了不同的配置选项,并且基本上没有获得任何新的起点。事实证明,系统管理员已安装了最新的Spark 3.0,但是肯定存在问题。
我安装了spark 2.4.4,确保选择了Java 8 Pyspark error - Unsupported class file major version 55
一切都按预期进行