Я новичок в pyspark, и у меня есть CSV-файл "test", содержащий поля:
click, impresion, userid
И еще один CSV "profile1", содержащий:
идентификатор пользователя, пол, возраст
Моя цель - иметь возможность выполнить запрос sql для этих двух файлов:
select age, sex, sum(click/impresion) from profile1,test where profile1.userid=test.userid group by age,sex
С помощью блоков данных я импортирую оба файла CSVи определите пару таблиц "profile1" с click, impresion и userid и "test" с userid, age и sex в качестве полей.
Сделано, что я делаю следующее, чтобы выполнить действие, которое я хочу сделать:
Итак, я открываю рабочую среду в кирпичах данных и с помощью sqlContext я делаю следующее
df3 = sqlContext.sql("select profile1.age, profile1.sex, sum((click/impresion)) from profile1,test where profile1.userid = test.userid group by profile1.age, profile1.sex")
Моя цель - извлечь то же самое с помощью фреймов данных или файлов с помощью pyspark.
IКроме того, в блоках данных было проверено следующее:
profile_file ="/FileStore/tables/profile.txt"
click_file = "/FileStore/tables/test.txt"
profile_lines = sc.textFile(profile_file)
click_lines = sc.textFile(click_file)
profiledata = profile_lines.map(lambda l: l.split()).map(lambda l: ( int(l[0]), l[1], l[2] ))
clickdata = click_lines.map(lambda l: l.split()).map(lambda l: ( int(l[11]),float(l[0]),float(l[1])))
profiledf = spark.createDataFrame(profiledata, schema=['user', 'sex', 'age'])
clickdatadf = spark.createDataFrame(clickdata, schema=['user', 'click','impresion'])
ta = profiledf.alias('ta')
tb = clickdatadf.alias('tb')
inner_join = ta.join(tb, ta.user == tb.user)
joined = ta.join(tb, tb.user == ta.user).select('ta.user','tb.click','tb.impresion','ta.sex','ta.age')
grupo = joined.select(joined["click"]/joined["impresion"], joined["sex"],joined["age"]).groupby("age","sex")
grupo.sum("(click / impresion)").show()
Являются ли эти два фрагмента кода эквивалентными с точки зрения данных, которые они получают?Если нет, то как мне сделать код с объединением, эквивалентным первому?
Я хочу добавить, что если я выполню оба запроса, они не будут возвращать один и тот же результат.
Спасибо!