Apache spark 关于Spark Dataframereader jdbc

Apache spark 关于Spark Dataframereader jdbc,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个关于Spark Dataframereader机制的问题。如果有人能帮助我,我将不胜感激。让我在这里解释一下情况 我正在从这样的数据流创建一个数据帧。这是输入数据中的一部分 var config = new HashMap[String,String](); config += ("zookeeper.connect" ->zookeeper); config += ("partition.assign

我有一个关于Spark Dataframereader机制的问题。如果有人能帮助我,我将不胜感激。让我在这里解释一下情况

我正在从这样的数据流创建一个数据帧。这是输入数据中的一部分

 var config = new HashMap[String,String]();
        config += ("zookeeper.connect" ->zookeeper);        
        config += ("partition.assignment.strategy" ->"roundrobin");
        config += ("bootstrap.servers" ->broker);
        config += ("serializer.class" -> "kafka.serializer.DefaultEncoder");
        config += ("group.id" -> "default"); 

        val lines =  KafkaUtils.createDirectStream[String, Array[Byte], StringDecoder, DefaultDecoder](ssc,config.toMap,Set(topic)).map(_._2)

        lines.foreachRDD { rdd =>

                if(!rdd.isEmpty()){

                    val rddJson = rdd.map { x => MyFunctions.mapToJson(x) }       
                    



                           
                    val sqlContext = SQLContextSingleton.getInstance(ssc.sparkContext)

                    val rddDF = sqlContext.read.json(rddJson)

                    rddDF.registerTempTable("inputData")
            
                   

 val dbDF = ReadDataFrameHelper.readDataFrameHelperFromDB(sqlContext, jdbcUrl, "ABCD","A",numOfPartiton,lowerBound,upperBound)
以下是ReadDataFrameHelper的代码

def readDataFrameHelperFromDB(sqlContext:HiveContext,jdbcUrl:String,dbTableOrQuery:String,
            columnToPartition:String,numOfPartiton:Int,lowerBound:Int,highBound:Int):DataFrame={

        val jdbcDF = sqlContext.read.jdbc(url = jdbcUrl, table = dbTableOrQuery,
                columnName = columnToPartition,
                lowerBound = lowerBound,
                upperBound = highBound,
                numPartitions = numOfPartiton,
                connectionProperties = new java.util.Properties()
                )
                
            jdbcDF  

    }
最后,我正在做一个这样的连接

 val joinedData = rddDF.join(dbDF,rddDF("ID") === dbDF("ID")
                                 && rddDF("CODE") === dbDF("CODE"),"left_outer")
                        .drop(dbDF("code"))
                        .drop(dbDF("id"))
                        .drop(dbDF("number"))
                        .drop(dbDF("key"))
                        .drop(dbDF("loaddate"))
                        .drop(dbDF("fid"))
joinedData.show()

我的输入数据流将有1000行,数据将包含数百万行。因此,当我执行此联接时,将spark从数据库中加载所有行并读取这些行,或者这只是从DB中读取具有输入数据流中的
code,id
的特定行,正如zero323所指定的,我还确认将从表中读取全部数据。我检查了数据库会话日志,发现整个数据集都在加载


感谢zero323,它将加载完整的表。这里没有谓词下推。
columnToPartition
是否需要具有唯一的值?我无法预见使用非唯一列会违反读取操作的正确性(除了大小不均的任务)@y2k shubham问题不是正确性。是因为Dataframe重编了整个表并进行了计算。我仍然转移到了一个新项目。我不知道两年后我是如何解决这个问题的years@Saurabh莎玛:对不起,我不想澄清你的问题;相反,我是在问我自己的疑问:在方法
spark.read.jdbc(..)
中,
columnName
列是否需要在RDBMS端有唯一的约束?我一直认为这是必须的,但仔细看一下文档和示例,再深入思考,我觉得这并不是必须的。实际上,我的困惑源于列
columnName
应该被索引以利用并行化的优势,并且由于唯一的列被索引,我认为。。但现在我明白了。谢谢你。