在pyspark dataframe中读取配置单元分区ORC表时逻辑和物理计划的工作方式

在pyspark dataframe中读取配置单元分区ORC表时逻辑和物理计划的工作方式,dataframe,hive,pyspark,orc,Dataframe,Hive,Pyspark,Orc,我已经创建了一个从hdfs位置读取csv的spark数据帧 emp_df=spark.read.formatcom.databricks.spark.csv\ .optionmode,drop格式不正确\ .optionheader,true\ .optioninferschema,对\ .optiondelimiter、.loadPATH\u到\u文件 并使用partitionBy方法将此数据帧保存为配置单元分区的orc表 emp_df.repartition5,'emp_id'。write.

我已经创建了一个从hdfs位置读取csv的spark数据帧

emp_df=spark.read.formatcom.databricks.spark.csv\ .optionmode,drop格式不正确\ .optionheader,true\ .optioninferschema,对\ .optiondelimiter、.loadPATH\u到\u文件 并使用partitionBy方法将此数据帧保存为配置单元分区的orc表

emp_df.repartition5,'emp_id'。write.format'orc'。partitionByemp_id.saveAsTableUDB.attable 当我按照下面的方法阅读此表时,如果我查看逻辑和物理计划,它似乎已经使用分区键列完美地过滤了数据:

emp_df_1=spark.sqlselect*from UDB.tentable其中emp_id='6' emp_df_1.解释 *************************************************************************** ==已解析的逻辑计划== “项目[*] +-“过滤器”emp_id=6 +-'UnsolvedRelationship'UDB`.'Dentiable'` ==分析的逻辑计划== emp_name:string,emp_city:string,emp_salary:int,emp_id:int 项目[emp_名称7399,emp_城市7400,emp_工资7401,emp_id7402] +-过滤器emp_id7402=cast6为int +-易受诱惑的亚Queryalias +-关系[emp_名称7399、emp_城市7400、emp_工资7401、emp_id7402]orc ==优化的逻辑计划== 过滤器不为空emp_id7402&&emp_id7402=6 +-关系[emp_名称7399、emp_城市7400、emp_工资7401、emp_id7402]orc ==实际计划== *1 FileScan或emp udb.tentable[emp_name 7399,emp_city7400,emp_salary7401,emp_id7402]批处理:true,格式:orc,位置:prunedMemoryFileIndex[hdfs://pathlocation/database/udb...., PartitionCount:1,PartitionFilters:[isnotnullemp_id7402,emp_id7402=6],PushedFilters:[],ReadSchema:struct *************************************************************************** 然而,如果我通过绝对hdfs路径位置读取此数据帧,它似乎无法使用分区键列过滤数据:

emp_df_2=spark.read.formatorc。loadhdfs://pathlocation/database/udb.db/temptable/emp_id=6 emp_df_2.解释 ****************************************************************************** ==已解析的逻辑计划== 关系[emp_姓名7411,emp_城市7412,emp_薪水7413]orc ==分析的逻辑计划== emp_名称:string,emp_城市:string,emp_工资:int 关系[emp_姓名7411,emp_城市7412,emp_薪水7413]orc ==优化的逻辑计划== 关系[emp_姓名7411,emp_城市7412,emp_薪水7413]orc ==实际计划== *1文件扫描orc[emp_name 7411,emp_city7412,emp_salary7413]批处理:true,格式:orc,位置:InMemoryFileIndex[hdfs://pathlocation/data/database/udb.db/tem..., PartitionFilters:[],PushedFilters:[],ReadSchema:struct ********************************************************************************
您能帮助我理解这两种情况下的逻辑和物理计划吗?

在您的第二个示例中,分区位置已包含在HDFS路径中。您仍然可以将父目录作为路径,并通过以下代码使用分区:

完整数据集\u df=spark.read.formatorc\ .loadhdfs://pathlocation/database/udb.db/temptable 一个分区\u df=full\u数据集\u df.wherefull\u数据集\u df.emp\u id==6
值得一提的是,无论您使用这三种方法中的哪一种,数据处理性能都是相同的。

我认为没有问题,您的问题没有问题。我将对此进行投票,至少我可以这样做:-