Apache spark 从Spark中的数据帧筛选和选择数据

Apache spark 从Spark中的数据帧筛选和选择数据,apache-spark,Apache Spark,我正在开发一个Spark JDBC程序 到目前为止,我提出了以下代码: object PartitionRetrieval { var conf = new SparkConf().setAppName("Spark-JDBC") val log = LogManager.getLogger("Spark-JDBC Program") Logger.getLogger("org").setLevel(Level.ERROR) val conFile

我正在开发一个Spark JDBC程序 到目前为止,我提出了以下代码:

object PartitionRetrieval {
    var conf  = new SparkConf().setAppName("Spark-JDBC")
    val log   = LogManager.getLogger("Spark-JDBC Program")
    Logger.getLogger("org").setLevel(Level.ERROR)
    val conFile       = "/home/hmusr/ReconTest/inputdir/testconnection.properties"
    val properties    = new Properties()
    properties.load(new FileInputStream(conFile))
    val connectionUrl = properties.getProperty("gpDevUrl")
    val devUserName   = properties.getProperty("devUserName")
    val devPassword   = properties.getProperty("devPassword")
    val driverClass   = properties.getProperty("gpDriverClass")
    val tableName     = "source.bank_accounts"
    try {
    Class.forName(driverClass).newInstance()
    } catch {
    case cnf: ClassNotFoundException =>
        log.error("Driver class: " + driverClass + " not found")
        System.exit(1)
    case e: Exception =>
        log.error("Exception: " + e.printStackTrace())
        System.exit(1)
    }
    def main(args: Array[String]): Unit = {
        val spark   = SparkSession.builder().config(conf).master("yarn").enableHiveSupport().getOrCreate()
        val gpTable = spark.read.format("jdbc").option("url", connectionUrl)
                                                        .option("dbtable",tableName)
                                                        .option("user",devUserName)
                                                        .option("password",devPassword).load()
        val rc = gpTable.filter(gpTable("source_system_name")==="ORACLE").count()
        println("gpTable Count: " + rc)
    }
}
在上面的代码中,语句:
val gpTable=spark.read.format(“jdbc”).option(“url”,connectionUrl)
table:bank\u accounts
的整个数据转储到
DataFrame:gpTable
中,然后
DataFrame:rc
获取过滤后的数据。我对表有这样的怀疑:bank_accounts是一个非常小的表,如果将其作为一个整体加载到内存中,则不会产生任何影响。但在我们的生产中,有数十亿条记录的表格。在这种情况下,建议使用JDBC连接将数据加载到数据帧中的方法是什么? 有人能告诉我Spark Jdbc的入门点的概念吗?

  • 声明会不会。。。将表:bank_accounts的全部数据转储到DataFrame:gpTable中,然后DataFrame:rc获取过滤后的数据

    否。
    DataFrameReader
    不急切。它只定义数据绑定

    此外,简单的谓词(如平凡相等)将检查推送到源代码,并且在执行计划时只加载所需的列

    在数据库日志中,您应该看到类似的查询

     SELECT 1 FROM table WHERE source_system_name = 'ORACLE'
    
  • 如果它作为一个整体作为数据帧加载到内存中

    不可以。Spark不会在内存中加载数据,除非它被指示(主要是
    缓存
    ),即使这样,它也会将自身限制为适合可用存储内存的块

    在标准过程中,它只保留计算计划所需的数据。对于全局计划,内存占用不应取决于数据量

  • 在这种情况下,建议使用JDBC连接将数据加载到数据帧中的方法是什么

    有关可伸缩性的问题,请检查

    此外,你还可以阅读