青牛

第 12 位会员
注册于 2016-12-24 21:53:20
活跃于 2024-04-02 22:38:12


  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • sparksql 因为 where 条件类型而导致的数据倾斜的问题? at 2023-03-03 18:50:32

    对于日期类型的列,Spark JDBC 连接器并不会在过滤条件中使用分区列来进行优化。这意味着当您使用 Spark JDBC 连接器读取包含日期类型列的表时,Spark 会在整个表中扫描数据,而不仅仅是扫描符合过滤条件的数据,从而可能导致数据倾斜。

    为了解决这个问题,您可以使用以下两种方法之一:

    1.将日期类型的列转换为字符串类型,以便 Spark 能够在读取数据时使用分区列进行优化。您可以在读取数据之前使用 SQL 中的 CAST 函数或 DataFrame API 中的 withColumn 函数将日期类型的列转换为字符串类型。例如:

    SELECT *, CAST(operatetime AS STRING) AS operatetime_str FROM user WHERE operatetime > '2023-01-01' AND operatetime < '2023-01-31'

    val df = spark.read.jdbc(mysql_url, "user", prop)
      .where("operatetime > '2023-01-01' AND operatetime < '2023-01-31'")
      .withColumn("operatetime_str", col("operatetime").cast(StringType))

    2.增加数据分区,使每个分区的大小不超过合理的范围。这样,即使 Spark 无法使用分区列进行优化,也可以在多个分区上并行读取数据,从而减少数据倾斜的可能性。例如:

    val df = spark.read.jdbc(mysql_url, "user", 
        new Properties() {
            put("fetchsize", fetchsize)
            put("partitionColumnoption", "operatetime")
            put("lowerBound", "2023-01-01")
            put("upperBound", "2023-01-31")
            put("numPartitions", numPartitions)
        })
      .where("operatetime > '2023-01-01' AND operatetime < '2023-01-31'")

    请注意,增加数据分区可能会增加查询的总运行时间和内存开销。因此,您需要权衡分区大小和查询性能之间的权衡

  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 信息被删除或无权限查看
  • 新手问题? at 2023-02-13 21:09:42

    已解决,自家网络代理问题

  • 不能按 esc,怎么保存 vi 文件? at 2023-02-13 20:52:27

    不要在微信里打开网址,在chrome等浏览器上打开 http://cloud.hainiubl.com