相关疑难解决方法(0)

如何定义DataFrame的分区?

我已经开始在Spark 1.4.0中使用Spark SQL和DataFrames.我想在Scala中定义DataFrame上的自定义分区程序,但是没有看到如何执行此操作.

我正在使用的一个数据表包含一个事务列表,按帐户,silimar到下面的示例.

Account   Date       Type       Amount
1001    2014-04-01  Purchase    100.00
1001    2014-04-01  Purchase     50.00
1001    2014-04-05  Purchase     70.00
1001    2014-04-01  Payment    -150.00
1002    2014-04-01  Purchase     80.00
1002    2014-04-02  Purchase     22.00
1002    2014-04-04  Payment    -120.00
1002    2014-04-04  Purchase     60.00
1003    2014-04-02  Purchase    210.00
1003    2014-04-03  Purchase     15.00
Run Code Online (Sandbox Code Playgroud)

至少在最初,大多数计算将发生在帐户内的交易之间.所以我希望对数据进行分区,以便帐户的所有事务都在同一个Spark分区中.

但我没有看到定义这个的方法.DataFrame类有一个名为"repartition(Int)"的方法,您可以在其中指定要创建的分区数.但我没有看到任何方法可用于为DataFrame定义自定义分区程序,例如可以为RDD指定.

源数据存储在Parquet中.我确实看到在向Parquet编写DataFrame时,您可以指定要分区的列,因此我可以告诉Parquet通过"帐户"列对其数据进行分区.但是可能有数百万个帐户,如果我正确理解Parquet,它会为每个帐户创建一个独特的目录,因此这听起来不是一个合理的解决方案.

有没有办法让Spark分区这个DataFrame,以便一个帐户的所有数据都在同一个分区?

scala partitioning dataframe apache-spark apache-spark-sql

119
推荐指数
5
解决办法
14万
查看次数

HashPartitioner如何运作?

我读了一下文档HashPartitioner.不幸的是,除了API调用之外没有解释太多.我假设HashPartitioner根据键的哈希对分布式集进行分区.例如,如果我的数据是这样的

(1,1), (1,2), (1,3), (2,1), (2,2), (2,3)
Run Code Online (Sandbox Code Playgroud)

因此,分区器会将其放入不同的分区,同一个键落在同一个分区中.但是我不明白构造函数参数的意义

new HashPartitoner(numPartitions) //What does numPartitions do?
Run Code Online (Sandbox Code Playgroud)

对于上述数据集,如果我这样做,结果会有何不同

new HashPartitoner(1)
new HashPartitoner(2)
new HashPartitoner(10)
Run Code Online (Sandbox Code Playgroud)

那么HashPartitioner工作怎么样呢?

scala partitioning apache-spark rdd

77
推荐指数
2
解决办法
3万
查看次数

Spark SQL - df.repartition和DataFrameWriter partitionBy之间的区别?

DataFrame repartition()和DataFrameWriter partitionBy()方法有什么区别?

我希望两者都习惯于"基于数据帧列分区数据"?或者有什么区别?

data-partitioning apache-spark-sql

42
推荐指数
3
解决办法
3万
查看次数

Spark:read.jdbc(..numPartitions..) 和 repartition(..numPartitions..) 中 numPartitions 的区别

numPartitions对以下方法中参数的行为感到困惑:

  1. DataFrameReader.jdbc
  2. Dataset.repartition

官方的文档DataFrameReader.jdbc的发言权就下列numPartitions参数

numPartitions : 分区数。这与lowerBound(包含)、upperBound(不包含)一起形成用于生成的WHERE 子句表达式的分区步幅,用于均匀地拆分列columnName。

官方的文档Dataset.repartition发言权

返回一个具有精确numPartitions分区的新数据集。


我目前的理解:

  1. 方法中的numPartition参数DataFrameReader.jdbc控制从数据库读取数据的并行度
  2. numPartition参数Dataset.repartition控制输出文件的数量时,这将生成DataFrame将被写入到磁盘

我的问题:

  1. 如果我DataFrame通过读取DataFrameReader.jdbc然后将其写入磁盘(不调用repartition方法),那么输出中的文件是否仍然与我DataFrame在调用后将其写到磁盘repartition上的文件一样多?
  2. 如果以上问题的答案是:
    • 是:那么repartitionDataFrame使用DataFrameReader.jdbc方法(带numPartitions参数)读取的方法上调用方法是多余的吗?
    • 否:那么请纠正我的理解错误。同样在这种情况下numPartitionsDataFrameReader.jdbc方法的参数不应该被称为“并行”之东西吗?

dataframe apache-spark spark-dataframe spark-jdbc

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