火花数据框架是否懒散地加载拼花地板数据?

时间:2018-05-17 10:44:17

标签: scala apache-spark dataframe parquet

我想使用以下代码在spark中运行我的镶木地板数据

val parquetDF = spark.read.parquet(path)
parquetDF.createOrReplaceTempView("table_name")
val df = spark.sql("select column_1, column_4, column 10 from table_name");
println(df.count())

我的问题是,此代码是否只读取光盘中所需的列?

理论上答案应该是肯定的。但我需要专家意见,因为在Jdbc查询(Mysql)的情况下, 与动作相比,read(spark.read)阶段花费的时间更多(可能与连接有关但不确定)。接下来是Jdbc代码,

spark.read.format("jdbc").jdbc(jdbcUrl, query, props).createOrReplaceTempView(table_name)
spark.sql("select column_1, column_4, column 10 from table_name");
df.show()
println(df.count())

如果有人能够在两种情况下解释框架流程,那将非常有用。

Spark版本2.3.0

Scala版本2.11.11

1 个答案:

答案 0 :(得分:2)

在这两种情况下,Spark都会尽力而为(确切的行为取决于格式和版本。根据上下文,可能不会应用某些优化,通常使用深度嵌套的数据)将流量限制为仅需要的数据。事实上,SELECT 1 FROM table部分甚至不相关,因为对于给定的格式,实际查询应限于等同于cache的内容。

只要您不使用persist / <?php $html = file_get_contents('page_1_second.html'); $dom = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $dom->loadHtml('<?xml encoding="utf-8" ?>'.$html); libxml_use_internal_errors($internalErrors); $finder = new DomXPath($dom); $classname = 'row1h'; $nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"); $tmp_dom = new DOMDocument(); foreach($nodes as $node) { $tmp_dom->appendChild($tmp_dom->importNode($node,true)); } $innerHTML = trim($tmp_dom->saveHTML()); $output = new DOMDocument(); $internalErrors = libxml_use_internal_errors(true); $output->loadHtml('<?xml encoding="utf-8" ?>'.$innerHTML); libxml_use_internal_errors($internalErrors); foreach($output->getElementsByTagName('a') as $link) { echo '<topic_title>'.$link->nodeValue.'</topic_title>'. '<br>'.'/r/n'. '<topic_desc>'.$link->getAttribute('title').'</topic_desc>'. '<br><br>'; } ?> ,这一点就会成立。如果这样做,所有优化都会消失,Spark会急切地加载所有数据(请参阅我对Any performance issues forcing eager evaluation using count in spark?Caching dataframes while keeping partitions的回答。另外here is an example使用缓存时执行计划的变化情况。