Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用连接从rdbms数据库加载数据到spark的方法应该是什么_Scala_Apache Spark_Apache Spark Sql_Rdbms - Fatal编程技术网

Scala 使用连接从rdbms数据库加载数据到spark的方法应该是什么

Scala 使用连接从rdbms数据库加载数据到spark的方法应该是什么,scala,apache-spark,apache-spark-sql,rdbms,Scala,Apache Spark,Apache Spark Sql,Rdbms,我是Spark 2.4的新手,正在尝试找出将GreenPlum/PostgreSQL中的数据引入Spark的最佳方法 使用联接查询从RDBMS加载数据,还是使用按DB列分区单独加载表,然后使用spark联接更好 跨多个大型表进行连接的本机查询可以使用下面的代码,但不确定这是否是一种正确的方法,也不确定如何给出分区 val jdbcDF = spark.read.format("jdbc") .option("url", "jdbc:postgresql://localhost:5432/

我是Spark 2.4的新手,正在尝试找出将GreenPlum/PostgreSQL中的数据引入Spark的最佳方法

使用联接查询从RDBMS加载数据,还是使用按DB列分区单独加载表,然后使用spark联接更好

跨多个大型表进行连接的本机查询可以使用下面的代码,但不确定这是否是一种正确的方法,也不确定如何给出分区

val jdbcDF = spark.read.format("jdbc")
    .option("url", "jdbc:postgresql://localhost:5432/test")
    .option("user", "user1")
    .option("password", "password1")
    .option("query", "select a.*, b.* from a join on b a.user_id = b.user_id)
    //not sure what should go here for query with multiple joins.
    //.option("partitionColumn", "*")

我想最快的选择是首先将数据从RDBMS并行加载到集群存储:例如HDFS或S3。您将以与当前load语句类似的方式执行此操作,但是您将首先使用properties partitionColumn lowerBound upperBound为表定义分区,请参见。一般来说,这是非常快的。唯一的缺点是,在最好的情况下,您需要一个数值列,它的值分布均匀:自动递增的ID或时间戳通常非常好


如果使用像spark这样的可伸缩引擎,在真正巨大的表上执行计算量大的操作通常要快得多

我认为将操作卸载到数据库而不是Spark将是最好的,在我的情况下,使用HDFS或S3是不可能的。partitionColumn、lowerBound、upperBound我知道它们在单个表上是如何工作的,但不确定联接查询的值是什么。这些表有一个主键,它的类型为Long,并且是增量的@Elmar MacekYou当然也可以将其存储在spark节点的本地普通文件存储中。当在查询(如联接)定义的表上使用分区时,分区将无法正常工作:在将任何结果流式传输到集群afaik之前,必须在数据库中创建整个结果。所以我的建议仍然是:首先从数据库中获取数据,并将其作为ORC或拼花地板保存。然后使用spark进行连接。