Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Python激发了如何将一个rdd的字段映射到另一个rdd_Python_Apache Spark_Pyspark - Fatal编程技术网

Python激发了如何将一个rdd的字段映射到另一个rdd

Python激发了如何将一个rdd的字段映射到另一个rdd,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我是PythonSpark的新手,根据上面的主题,我想将一个Rdd的字段映射到另一个Rdd的字段 rdd1: rdd2: 因此,匹配的c_id将替换为name和cnid,并聚合cn_值。因此,输出将类似于abc 0 0 pqr 0 1 from pyspark import SparkContext import csv sc = SparkContext("local", "spark-App") file1 = sc.textFile('/home/hduser/sample.csv').m

我是PythonSpark的新手,根据上面的主题,我想将一个Rdd的字段映射到另一个Rdd的字段

rdd1:

rdd2:

因此,匹配的c_id将替换为namecnid,并聚合cn_值。因此,输出将类似于abc 0 0 pqr 0 1

from pyspark import SparkContext
import csv
sc = SparkContext("local", "spark-App")
file1 = sc.textFile('/home/hduser/sample.csv').map(lambda line:line.split(',')).filter(lambda line:len(line)>1)
file2 = sc.textFile('hdfs://localhost:9000/sample2/part-00000').map(lambda line:line.split(','))
file1_fields = file1.map(lambda x: (x[0],x[1]))
file2_fields = file2.map(lambda x: (x[0],x[1],float(x[2])))
如何通过在这里放置一些代码来实现我的目标

任何帮助都将不胜感激
谢谢你

你正在寻找的操作叫做
join
。给定一个文件的结构,最好使用and(我假设第二个文件也是逗号分隔的,但没有头)。让我们从虚拟数据开始:

file1 = ... # path to the first file
file2 = ... # path to the second file

with open(file1, "w") as fw:
    fw.write("c_id,name\n121210,abc\n121211,pqr")

with open(file2, "w") as fw:
    fw.write("121211,0,0\n121210,0,1")
读取第一个文件:

df1 = (sqlContext.read 
    .format('com.databricks.spark.csv')
    .options(header='true', inferSchema='true')
    .load(file1))
加载第二个文件:

schema = StructType(
    [StructField(x, LongType(), False) for x in ("c_id", "cn_id", "cn_value")])

df2 = (sqlContext.read 
    .format('com.databricks.spark.csv')
    .schema(schema)
    .options(header='false')
    .load(file2))
最后加入:

combined = df1.join(df2, df1["c_id"] == df2["c_id"])
combined.show()

## +------+----+------+-----+--------+
## |  c_id|name|  c_id|cn_id|cn_value|
## +------+----+------+-----+--------+
## |121210| abc|121210|    0|       1|
## |121211| pqr|121211|    0|       0|
## +------+----+------+-----+--------+
编辑

使用RDD,您可以执行以下操作:

file1_fields.join(file2_fields.map(lambda x: (x[0], x[1:])))

有一个名为
join
的操作和一个名为。您还应该看看@mlk,我想给OP一个展示一些努力的机会:)我们是否可以在不使用dataframe的情况下实现它,比如使用纯Spark转换和操作。通过设置键并用名称替换c_id并聚合cn_值…您可以,但由于您的输入是表格形式的,因此没有任何意义。谢谢,file1中的数据用多个字段逗号分隔,file2中的数据也用三个字段逗号分隔,但file2不是csv。file2是hdfs部分文件,我必须映射并聚合这两个文件的结果。基于file1中的c_id和file2中的c_id,然后使用各自的名称重新组合c_id,并基于file2中的c_id和cn_id聚合结果。file1_字段。join(file2_字段.map(lambda x:(x[0],x[1:]),这会给我类似(u'121210',(u'abc',(u'abc',(u'0',0))的结果)我们可以去掉这些括号,得到像121210,abc,0,0这样的op吗。请查看
join
输出以下结构
(键,(左值,右值))
。这是一个标准的Python元组,因此您可以根据需要对其进行重塑。
combined = df1.join(df2, df1["c_id"] == df2["c_id"])
combined.show()

## +------+----+------+-----+--------+
## |  c_id|name|  c_id|cn_id|cn_value|
## +------+----+------+-----+--------+
## |121210| abc|121210|    0|       1|
## |121211| pqr|121211|    0|       0|
## +------+----+------+-----+--------+
file1_fields.join(file2_fields.map(lambda x: (x[0], x[1:])))