PySpark(python2.7):如何在reduce之后展平值
我正在使用带有自定义分隔符的SparkContext.newAPIHadoopFile读取多行记录文件。无论如何,我已经准备好了,减少了我的数据。但是现在我想再次将密钥添加到每一行(条目),然后将其写入apacheparquet文件,然后将其存储到HDFS中 这个数字应该可以解释我的问题。我要找的是红色箭头,例如写入文件之前的最后一次转换。有什么想法吗?我尝试了flatMap,但是时间戳和浮点值导致了不同的记录PySpark(python2.7):如何在reduce之后展平值,python,python-2.7,hadoop,apache-spark,pyspark,Python,Python 2.7,Hadoop,Apache Spark,Pyspark,我正在使用带有自定义分隔符的SparkContext.newAPIHadoopFile读取多行记录文件。无论如何,我已经准备好了,减少了我的数据。但是现在我想再次将密钥添加到每一行(条目),然后将其写入apacheparquet文件,然后将其存储到HDFS中 这个数字应该可以解释我的问题。我要找的是红色箭头,例如写入文件之前的最后一次转换。有什么想法吗?我尝试了flatMap,但是时间戳和浮点值导致了不同的记录 Python脚本可以是和示例。我正在Jupyter笔记本中使用Python代码。简
Python脚本可以是和示例。我正在Jupyter笔记本中使用Python代码。简单的列表理解应该足够了:
from datetime import datetime
def flatten(kvs):
"""
>>> kvs = ("852-YF-008", [
... (datetime(2016, 5, 10, 0, 0), 0.0),
... (datetime(2016, 5, 9, 23, 59), 0.0)])
>>> flat = flatten(kvs)
>>> len(flat)
2
>>> flat[0]
('852-YF-008', datetime.datetime(2016, 5, 10, 0, 0), 0.0)
"""
k, vs = kvs
return [(k, v1, v2) for v1, v2 in vs]
在Python 2.7中,还可以将lambda表达式与元组参数解包一起使用,但这是不可移植的,通常不鼓励使用:
lambda (k, vs): [(k, v1, v2) for v1, v2 in vs]
独立于版本:
lambda kvs: [(kvs[0], v1, v2) for v1, v2 in kvs[1]]
编辑:
如果您只需要写入分区数据,则直接转换为拼花地板,而无需reduceByKey
:
(sheet
.flatMap(process)
.map(lambda x: (x[0], ) + x[1])
.toDF(["key", "datettime", "value"])
.write
.partitionBy("key")
.parquet(output_path))
此图不反映您的代码。您可以展开成对的
(键,元组(…)
,然后连接元组,这不太可能是理想的结果。换句话说,reduceByKey
part是错误的。可能是。只需确保所有值都被混洗到同一台机器上。如果一个变量出现在集群中不同机器上读入的多个文件中。如果是,您是对的。我的ReduceByKey错了。但是,如何将洗牌减少步骤中的列表连接到一个列表?最初我是这样做的。我真的不明白你为什么需要这个放在首位(见编辑)。链接的答案并不好。是的,非常感谢。我会尝试你的版本,虽然它有更好的性能。我发现这个解决方案也很有效:sheet.flatMap(process_and_extract).groupByKey().mapValues(lambda x:list(x)).flatMap(flatte).take(50)CheckDataFrameWriter.mode
。默认情况下,它将失败,但还有其他选择。阿尔索