根据pyspark文档,repartition应该使用哈希分区,这将导致分区大小略有不等。但是,我发现通过在之前加上limit,将产生完全相等的分区大小。这可以通过在pyspark shell中运行以下命令来显示:
df = spark.createDataFrame([range(5)] * 100)
def count_part_size(part_iter):
yield len(list(part_iter))
print(df.repartition(20).rdd.mapPartitions(count_part_size).collect())
# [4, 4, 4, 5, 4, 4, 5, 4, 5, 6, 6, 6, 7, 5, 5, 5, 5, 6, 5, 5]
print(df.limit(100).repartition(20).rdd.mapPartitions(count_part_size).collect())
# [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
Run Code Online (Sandbox Code Playgroud)
如果repartition使用哈希分区程序,为什么在这种情况下会产生完全相等的分区大小?如果未使用哈希分区程序,则使用哪种分区程序?
顺便说一句,我正在使用python版本2.7.15和spark版本2.0.2
我想随机排序一个数据帧,但以一种确定性的方式。我认为这样做的方法是使用orderBy种子rand函数。但是,我发现这在不同的机器上是不确定的。例如,考虑以下代码:
from pyspark.sql import types as T, functions as F
df = spark.createDataFrame(range(10), T.IntegerType())
df = df.orderBy(F.rand(seed=123))
print(df.show())
Run Code Online (Sandbox Code Playgroud)
当我在本地机器上运行它时,它会打印
+-----+
|value|
+-----+
| 3|
| 4|
| 9|
| 7|
| 8|
| 0|
| 5|
| 6|
| 2|
| 1|
+-----+
Run Code Online (Sandbox Code Playgroud)
但在 EC2 实例上,它打印
+-----+
|value|
+-----+
| 9|
| 5|
| 6|
| 7|
| 0|
| 1|
| 4|
| 8|
| 3|
| 2|
+-----+
Run Code Online (Sandbox Code Playgroud)
即使在不同的机器上运行,如何获得确定性的随机排序?
我的 pyspark 版本是 2.4.1
编辑 …
我几天前在堆栈溢出上发布了一个类似的问题(已经解决了),我不确定这里的礼仪是什么,但我正在发一个新帖子.
基本上,当我尝试将pandas DataFrame写入MySQL数据库时,我得到一个UnicodeEncodeError.我可以使用以下代码重现错误:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql://root:@localhost/testdb')
df = pd.DataFrame([[u'\u2013',2],['e',4]], index = ['a','b'], columns = ['c','d'])
df.to_sql('data', engine, if_exists = 'replace', index = False)
Run Code Online (Sandbox Code Playgroud)
这是错误:
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 0: ordinal not in range(256)
Run Code Online (Sandbox Code Playgroud)
这是追溯的最后一个相关行:
C:\Anaconda\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.pyc in do_executemany(self, cursor, statement, parameters, context)
93
94 def do_executemany(self, cursor, statement, parameters, context=None):
---> 95 rowcount = cursor.executemany(statement, parameters)
96 if context is not None:
97 context._rowcount = rowcount …Run Code Online (Sandbox Code Playgroud)