我们正在使用 spark 1.6.1 构建一个解决方案,我们需要读取一个 ORC 文件并在其上执行业务逻辑。关于读取 ORC 文件的 Spark 文档说,列格式允许读取器仅读取、解压缩和处理当前查询所需的列。但在我们的例子中,即使 SQL 查询只选择一列,SparkUI 也会显示整个文件正在被读取。
我在这里找到了关于 parquet 格式的类似问题 ->在读取特定 Parquet Column 时,读取所有列而不是 Parquet-Sql 中给出的单个列。但这并没有解决。
示例代码
ORC文件已创建如下:
lines = sc.textFile("file:///home/user/data/testdata.csv")
parts = lines.map(lambda l: l.split(","))
people = parts.map(lambda p: Row(id=int(p[0]),fname=p[1],mname=p[2],lname=p[3],address=p[4],marks=p[5],grade=p[6],age=p[7],experience=p[8]))
people.toDF().write.format("orc").save("/home/user/orcdata/people5m")
其内容如下:
from pyspark.sql import HiveContext, Row
sqlContext = HiveContext(sc)
people = sqlContext.read.format("orc").load("/home/user/orcdata/people5m")
people.registerTempTable("people")
addresses = sqlContext.sql("SELECT 'address' FROM people")
addresses.count()
HDFS 上的 ORC 数据大小为 91.6 M,在 SparkUI 上,相同的数字“91.6 M”显示在阶段选项卡的输入列中。这段代码有什么问题吗?有人可以解释这种行为吗?