SubqueryAlias ​​является нулевым в Spark 2.4. Логический план.Это ошибка? - PullRequest
1 голос
/ 19 сентября 2019

Я пишу программу для анализа SQL-запросов.Поэтому я использую логический план Spark.

Ниже приведен код, который я использую

object QueryAnalyzer {
val LOG = LoggerFactory.getLogger(this.getClass)

//Spark Conf
val conf = new 
SparkConf().setMaster("local[2]").setAppName("LocalEdlExecutor")

//Spark Context
val sc = new SparkContext(conf)

//sql Context
val sqlContext = new SQLContext(sc)

//Spark Session
val sparkSession = SparkSession
  .builder()
  .appName("Spark User Data")
  .config("spark.app.name", "LocalEdl")
  .getOrCreate()

def main(args: Array[String]) {

var inputDfColumns = Map[String,List[String]]()   
val dfSession =  sparkSession.
  read.
  format("csv").
  option("header", EdlConstants.TRUE).
  option("inferschema", EdlConstants.TRUE).
  option("delimiter", ",").
  option("decoding", EdlConstants.UTF8).
  option("multiline", true)

var oDF = dfSession.
  load("C:\\Users\\tarun.khaneja\\data\\order.csv")

println("smaple data in oDF====>")
  oDF.show()

  var cusDF = dfSession.
    load("C:\\Users\\tarun.khaneja\\data\\customer.csv")

  println("smaple data in cusDF====>")
  cusDF.show()


  oDF.createOrReplaceTempView("orderTempView")
  cusDF.createOrReplaceTempView("customerTempView")

  //get input columns from all dataframe
  inputDfColumns += ("orderTempView"->oDF.columns.toList)
  inputDfColumns += ("customerTempView"->cusDF.columns.toList)

  val res = sqlContext.sql("""select OID, max(MID+CID) as MID_new,ROW_NUMBER() OVER (
                               ORDER BY CID) as rn from 
                              (select OID_1 as OID, CID_1 as CID, OID_1+CID_1 as MID from
                              (select min(ot.OrderID) as OID_1, ct.CustomerID as CID_1
                                from orderTempView as ot inner join customerTempView as ct
                                on ot.CustomerID = ct.CustomerID group by CID_1)) group by OID,CID""")

  println(res.show(false))   

  val analyzedPlan = res.queryExecution.analyzed
  println(analyzedPlan.prettyJson)

} 

Теперь проблема в том, что в Spark 2.2.1 я получаю ниже json.где у меня есть SubqueryAlias, которые предоставляют важную информацию имени псевдонима для таблицы, которую мы использовали в запросе, как показано ниже.

   ...
   ...
   ...
[ {
    "class" : "org.apache.spark.sql.catalyst.expressions.AttributeReference",
    "num-children" : 0,
    "name" : "OrderDate",
    "dataType" : "string",
    "nullable" : true,
    "metadata" : { },
    "exprId" : {
      "product-class" : "org.apache.spark.sql.catalyst.expressions.ExprId",
      "id" : 2,
      "jvmId" : "acefe6e6-e469-4c9a-8a36-5694f054dc0a"
    },
    "isGenerated" : false
  } ] ]
}, {
  "class" : "org.apache.spark.sql.catalyst.plans.logical._**SubqueryAlias**_",
  "num-children" : 1,
  "alias" : "ct",
  "child" : 0
}, {
  "class" : "org.apache.spark.sql.catalyst.plans.logical._**SubqueryAlias**_",
  "num-children" : 1,
  "alias" : "customertempview",
  "child" : 0
}, {
  "class" : "org.apache.spark.sql.execution.datasources.LogicalRelation",
  "num-children" : 0,
  "relation" : null,
  "output" : 

   ...
   ...
   ...

Но в Spark 2.4 я получаю имя SubqueryAlias ​​как ноль.Как показано ниже в json.

   ...
   ...
    {
                "class": 
    "org.apache.spark.sql.catalyst.expressions.AttributeReference",
                "num-children": 0,
                "name": "CustomerID",
                "dataType": "integer",
                "nullable": true,
                "metadata": {},
                "exprId": {
                    "product-class": 
    "org.apache.spark.sql.catalyst.expressions.ExprId",
                    "id": 19,
                    "jvmId": "3b0dde0c-0b8f-4c63-a3ed-4dba526f8331"
                },
                "qualifier": "[ct]"
            }]
        }, {
            "class": 
    "org.apache.spark.sql.catalyst.plans.logical._**SubqueryAlias**_",
            "num-children": 1,
            "name": null,
            "child": 0
        }, {
            "class": 
    "org.apache.spark.sql.catalyst.plans.logical._**SubqueryAlias**_",
            "num-children": 1,
            "name": null,
            "child": 0
        }, {
            "class": 
    "org.apache.spark.sql.execution.datasources.LogicalRelation",
            "num-children": 0,
            "relation": null,
            "output": 

   ...
   ...

Итак, я не уверен, является ли это ошибкой в ​​Spark 2.4, из-за которой я получаю имя как пустое в SubquerAlias.Или, если это не ошибка, как я могу получить связь между псевдонимом и реальным именем таблицы.

Есть идеи по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...