【问题标题】:Is it possible to use Spark SQL with relational databases when the tables are big?当表很大时,是否可以将 Spark SQL 与关系数据库一起使用?
【发布时间】:2017-02-01 16:41:54
【问题描述】:

我想知道我们如何使用 spark SQL 来处理存储在关系数据库中的结构化大数据?我的表格包含超过 40 亿条线(GPS 坐标)。在使用 Merge 操作时,Spark 会尝试处理内存中的整个表,这是不可能的。我知道 Spark 是“内存中”处理,但就我而言,内存无法容纳整个表。那么当表很大时,是否可以将 spark 与关系数据库一起使用?

【问题讨论】:

    标签: sql apache-spark apache-spark-sql bigdata


    【解决方案1】:

    如果要读取的数据超过内存大小,Spark 不会一次将整个数据集缓存到内存中。 Spark 文档指出:

    Spark RDD Persistence

    Spark 中最重要的功能之一是跨操作将数据集持久化(或缓存)在内存中。当你持久化一个 RDD 时,每个节点都会将它计算的任何分区存储在内存中,并在该数据集的其他操作中重用它们

    另外,可以提供存储级别为 MEMORY_AND_DISK

    MEMORY_AND_DISK :将 RDD 作为反序列化的 Java 对象存储在 JVM 中。如果 RDD 不适合内存,请将不适合的分区存储在磁盘上,并在需要时从那里读取它们。

    您使用的任何 Spark 数据结构在内部都使用 RDD。

    同样假设您使用 JDBC 连接外部数据库,您可以指定属性 fetchsizebatchsize

    fetchsize :JDBC 提取大小,它确定每次往返要提取的行数。这有助于提高默认为低读取大小的 JDBC 驱动程序的性能(例如,具有 10 行的 Oracle)。此选项仅适用于阅读。

    batchsize :JDBC 批处理大小,它决定每次往返插入多少行。这有助于提高 JDBC 驱动程序的性能。此选项仅适用于写作。默认为 1000。

    JDBC To Other Databases

    val jdbcDF = spark.read
      .format("jdbc")
      .option("url", "jdbc:postgresql:dbserver")
      .option("dbtable", "schema.tablename")
      .option("user", "username")
      .option("password", "password")
      .option("fetchsize", "100")
      .load()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 2017-11-24
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2012-03-06
      相关资源
      最近更新 更多