小编Isa*_*aac的帖子

在pyspark中,为什么`limit`后跟`repartition`会创建完全相等的分区大小?

根据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

python apache-spark pyspark

5
推荐指数
1
解决办法
88
查看次数

如何在 pyspark 中获得确定性随机排序?

我想随机排序一个数据帧,但以一种确定性的方式。我认为这样做的方法是使用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

编辑 …

pyspark

5
推荐指数
1
解决办法
1279
查看次数

使用pandas方法to_sql与MySQL时的另一个UnicodeEncodeError

我几天前在堆栈溢出上发布了一个类似的问题(已经解决了),我不确定这里的礼仪是什么,但我正在发一个新帖子.

基本上,当我尝试将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)

python mysql pandas

4
推荐指数
1
解决办法
2857
查看次数

标签 统计

pyspark ×2

python ×2

apache-spark ×1

mysql ×1

pandas ×1