相关疑难解决方法(0)

通过Spark SQL批量迁移数据

我目前正在尝试通过Spark SQL将非常大的MySQL表的内容批量迁移到镶木地板文件中.但是当这样做时,即使将驱动程序的内存限制设置得更高(我在本地模式下使用spark),我也会快速耗尽内存.示例代码:

Dataset<Row> ds = spark.read()
    .format("jdbc")
    .option("url", url)
    .option("driver", "com.mysql.jdbc.Driver")
    .option("dbtable", "bigdatatable")
    .option("user", "root")
    .option("password", "foobar")
    .load();

ds.write().mode(SaveMode.Append).parquet("data/bigdatatable");
Run Code Online (Sandbox Code Playgroud)

似乎Spark试图将整个表内容读入内存,这样做不会很好.那么,通过Spark SQL进行批量数据迁移的最佳方法是什么?

apache-spark apache-spark-sql spark-dataframe

7
推荐指数
1
解决办法
4323
查看次数

来自 SQL 查询的 Spark Dataframe

我正在尝试使用 Apache Spark 将具有多个联接和子选择的(大型)SQL 查询的结果加载到 Spark 的 DataFrame 中,如从SQL 查询创建 Spark Dataframe中所述。

不幸的是,我尝试这样做会导致 Parquet 出现错误:

线程“main”org.apache.spark.sql.AnalysisException 中出现异常:无法推断 Parquet 的架构。必须手动指定。

我从谷歌看到的信息暗示当 DataFrame 为空时会发生此错误。但是,查询结果会在 DBeaver 中加载大量行。

这是一个示例查询:

(SELECT REPORT_DATE, JOB_CODE, DEPT_NBR, QTY
    FROM DBO.TEMP 
    WHERE  BUSINESS_DATE = '2019-06-18' 
    AND   STORE_NBR IN (999) 
    ORDER BY BUSINESS_DATE) as reports
Run Code Online (Sandbox Code Playgroud)

我的 Spark 代码如下所示。

val reportsDataFrame = spark
  .read
  .option("url", db2JdbcUrl)
  .option("dbtable", queries.reports)
  .load()

scheduledHoursDf.show(10)
Run Code Online (Sandbox Code Playgroud)

我在之前的答案中读到,可以使用此方法对整个数据库运行查询。特别是,如果您在第一次在 Spark 中构建 DataFrame 时将“dbtable”参数指定为别名查询。您可以看到我已经在查询中通过将整个查询指定为“as reports”别名来完成此操作。

我不认为这是一个重复的问题。我已经广泛研究了这个具体问题,但没有发现有人在网上面临同样的问题。特别是,运行查询导致的 Parquet 错误。

似乎一致认为不应该以这种方式运行 SQL 查询,而应该使用 Spark 的 DataFrames 的许多方法来过滤、分组和聚合数据。然而,如果能够使用原始 SQL,即使会带来性能损失,对我们来说也是非常有价值的。

sql db2 scala apache-spark parquet

0
推荐指数
1
解决办法
1910
查看次数