我想使用以下代码在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
答案 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使用缓存时执行计划的变化情况。