从RDD管道到DF Pyspark

从RDD管道到DF Pyspark,pyspark,spark-dataframe,pyspark-sql,Pyspark,Spark Dataframe,Pyspark Sql,当我开始寻求帮助时,这个问题似乎得到了很好的解决,但我还没有找到解决办法。事实上,你可能会发现一些你看到的尽可能重复的,但我想我在过去的几个小时里都试过了。据我所知,sqlContext将在这里发挥作用,但我愿意接受任何可行的答案。我用的是Spark 2.1 我从一个id列表开始,这个列表是我从mongodb中提取出来的。 样本输出: [u'182028', u'161936', u'12333', u'120677'] 'rated_game_ids_lst type:' <type '

当我开始寻求帮助时,这个问题似乎得到了很好的解决,但我还没有找到解决办法。事实上,你可能会发现一些你看到的尽可能重复的,但我想我在过去的几个小时里都试过了。据我所知,sqlContext将在这里发挥作用,但我愿意接受任何可行的答案。我用的是Spark 2.1

我从一个id列表开始,这个列表是我从mongodb中提取出来的。 样本输出:

[u'182028', u'161936', u'12333', u'120677']
'rated_game_ids_lst type:' <type 'list'>
'user_unrated_games:' [(19, u'174430', 3.4), (19, u'169786', 3.4)]
'user_unrated_games type:' <class 'pyspark.rdd.PipelinedRDD'>
('user_unrated_games type:', <class 'pyspark.rdd.PipelinedRDD'>)
('user_unrated_games:', [Row(game_id=u'174430', rating=3.4, user_id=19), Row(game_id=u'169786', rating=3.4, user_id=19)])
样本输出:

[u'182028', u'161936', u'12333', u'120677']
'rated_game_ids_lst type:' <type 'list'>
'user_unrated_games:' [(19, u'174430', 3.4), (19, u'169786', 3.4)]
'user_unrated_games type:' <class 'pyspark.rdd.PipelinedRDD'>
('user_unrated_games type:', <class 'pyspark.rdd.PipelinedRDD'>)
('user_unrated_games:', [Row(game_id=u'174430', rating=3.4, user_id=19), Row(game_id=u'169786', rating=3.4, user_id=19)])
然后我试试这个:

df = sqlContext.createDataFrame(user_unrated_games, ['user_id', 'game_id', 'rating'])
该方法失败,因此我尝试了以下方法:

user_unrated_games = ugr_rdd.filter(lambda x: x[1] not in rated_game_ids_lst).map(lambda x: Row(user_id=19, game_id=x[1], rating= x[2]))
样本输出:

[u'182028', u'161936', u'12333', u'120677']
'rated_game_ids_lst type:' <type 'list'>
'user_unrated_games:' [(19, u'174430', 3.4), (19, u'169786', 3.4)]
'user_unrated_games type:' <class 'pyspark.rdd.PipelinedRDD'>
('user_unrated_games type:', <class 'pyspark.rdd.PipelinedRDD'>)
('user_unrated_games:', [Row(game_id=u'174430', rating=3.4, user_id=19), Row(game_id=u'169786', rating=3.4, user_id=19)])
这两次尝试都会出现以下错误:

IllegalArgumentException: u"Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':"

从那时起,我开始尝试组合更改“用户id”的类型,等等,尝试按原样传递RDD,尝试将我的管道转换为RDD……坦白地说,我尝试了很多事情,但上面两种方法看起来最接近于其他方法

问题是,在调用
createDataFrame
方法时,需要指定包含数据类型的模式。像这样的事情应该可以做到:

from pyspark.sql.types import *

rdd = sc.parallelize([(19, 174430, 3.4), (19, 169786, 3.4)])

schema = StructType( [
    StructField('user_id', IntegerType()),
    StructField('game_id', IntegerType()),
    StructField('rating', FloatType())
    ])

df = spark.createDataFrame(rdd, schema)

df.show()

注意:我已经使用spark 2.1.0对此进行了测试。在这种情况下,
spark
是一个
SparkSession
对象。

注意这里的一个要点:您转换的rdd中的变量类型需要与您传递给createDataFrame的模式相匹配