代码之家  ›  专栏  ›  技术社区  ›  vaer-k Dogbert

为什么从红移到星火的读数这么慢?

  •  2
  • vaer-k Dogbert  · 技术社区  · 8 年前

    从AWS红移读取数据到我的星火星团有问题。读取超时并导致spark作业失败。我使用以下方法将数据检索到数据帧中:

    def retrieveFromDate(date: String): org.apache.spark.sql.DataFrame = {
        val query = "tstamp >= '2018-01-01' and tstamp < '2018-01-02'"
        val predicates = Array[String](query)
    
        val props = new Properties()
        props.put("user", "username")
        props.put("password", "password")
    
        spark.read
            .jdbc(url=jdbcURL, 
                  table="myschema.mytable", 
                  predicates=predicates,
                  connectionProperties=props)
    }
    

    select * from myschema.mytable
    WHERE tstamp >= '2018-08-01'
      AND tstamp < '2018-08-02';
    

    在Spark中,当我对数据帧执行任何操作(包括 count .

    如果我提供一个附加谓词,例如指定另一个谓词 WHERE 为什么这个查询在spark中运行得这么慢,而在SQL中却可以正常工作?我能做些什么把这么大的结果表从redshift加载到spark?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Karthick    8 年前
    >> The read is timing out and causing the spark job to fail
    

    predicates参数只是

    val query = "tstamp >= '2018-01-01' and tstamp < '2018-01-02'"

    因此,结果数据帧是“1”的分区,作为单个任务的结果,它容纳2400万。它没有平行性。

    您能否修改并提供将24M数据划分为多个块的谓词。那么,读可以并行化吗?

    像这样的事,

    val query=Arry[String](“列>=value1和列<value2”, .......)

    或

    如果您不想提供所有谓词,请将jdbc方法更改为below类型,并提供lowerBound、upperBound和numPartitions,然后它将再次受到分区列中均匀分布在其范围内的值的影响。

    public Dataset<Row> jdbc(String url,
                    String table,
                    String columnName,
                    long lowerBound,
                    long upperBound,
                    int numPartitions,
                    java.util.Properties connectionProperties)
    

    更多细节 here

    推荐文章