Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PySpark(python2.7):如何在reduce之后展平值_Python_Python 2.7_Hadoop_Apache Spark_Pyspark - Fatal编程技术网

PySpark(python2.7):如何在reduce之后展平值

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代码。简

我正在使用带有自定义分隔符的SparkContext.newAPIHadoopFile读取多行记录文件。无论如何,我已经准备好了,减少了我的数据。但是现在我想再次将密钥添加到每一行(条目),然后将其写入apacheparquet文件,然后将其存储到HDFS中

这个数字应该可以解释我的问题。我要找的是红色箭头,例如写入文件之前的最后一次转换。有什么想法吗?我尝试了flatMap,但是时间戳和浮点值导致了不同的记录


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)Check
DataFrameWriter.mode
。默认情况下,它将失败,但还有其他选择。阿尔索