Итак, у меня есть 2 вопроса, которые, я думаю, должны быть основными для людей, имеющих опыт работы с PySpark, но я не могу их решить.
Примеры записей в моем файле csv
:
"dfg.AAIXpWU4Q","1"
"cvbc.AAU3aXfQ","1"
"T-L5aw0L1uT_OfFyzbk","1"
"D9TOXY7rA_LsnvwQa-awVk","2"
"JWg8_0lGDA7OCwWcH_9aDc","2"
"ewrq.AAbRaACr2tVh5wA","1"
"ewrq.AALJWAAC-Qku3heg","1"
"ewrq.AADStQqmhJ7A","2"
"ewrq.AAEAABh36oHUNA","1"
"ewrq.AALJABfV5u-7Yg","1"
Я создаю следующий фреймворк данных:
>>> df2.show(3)
+-------+----+
|user_id|hits|
+-------+----+
|"aYk...| "7"|
|"yDQ...| "1"|
|"qUU...|"13"|
+-------+----+
only showing top 3 rows
Во-первых, это правильный способ преобразовать столбец hits
в IntegerType()
? Почему все значения становятся null
?
>>> df2 = df2.withColumn("hits", df2["hits"].cast(IntegerType()))
>>> df2.show(3)
+-------+----+
|user_id|hits|
+-------+----+
|"aYk...|null|
|"yDQ...|null|
|"qUU...|null|
+-------+----+
only showing top 3 rows
Во-вторых, мне нужно отсортировать этот список в порядке убывания по столбцу hits
. Итак, я попробовал это-
>>> df1 = df2.sort(col('hits').desc())
>>> df1.show(20)
Но я получаю следующую ошибку-
java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 2 fields are required while 18 values are provided.
Я предполагаю, что это связано с тем, что я создаю свой фрейм данных, используя:
>>> rdd = sc.textFile("/path/to/file/*")
>>> rdd.take(2)
['"7wAfdgdfgd","7"', '"1x3Qdfgdf","1"']
>>> my_df = rdd.map(lambda x: (x.split(","))).toDF()
>>> df2 = my_df.selectExpr("_1 as user_id", "_2 as hits")
>>> df2.show(3)
+-------+----+
|user_id|hits|
+-------+----+
|"aYk...| "7"|
|"yDQ...| "1"|
|"qUU...|"13"|
+-------+----+
only showing top 3 rows
И я предполагаю, что в некоторых строках есть лишние запятые. Как этого избежать или как лучше всего прочитать этот файл?