PySpark DataFrame Floor Разделение неподдерживаемых типов операндов - PullRequest
0 голосов
/ 11 июля 2020

У меня есть набор данных, как показано ниже:

введите описание изображения здесь

Я сгруппирован по возрасту и в среднем по количеству друзей для каждого возраста

from pyspark.sql import SparkSession
from pyspark.sql import Row
import pyspark.sql.functions as F

def parseInput(line):
    fields = line.split(',')
    return Row(age = int(fields[2]), numFriends = int(fields[3]))

spark = SparkSession.builder.appName("FriendsByAge").getOrCreate()
lines = spark.sparkContext.textFile("data/fakefriends.csv")
friends = lines.map(parseInput)
friendDataset = spark.createDataFrame(friends)
counts = friendDataset.groupBy("age").count()
total = friendDataset.groupBy("age").sum('numFriends')
res = total.join(counts, "age").withColumn("Friend By Age", (F.col("sum(numFriends)") // F.col("count"))).drop('sum(numFriends)','count')

Я получил ошибку ниже:

TypeError: unsupported operand type(s) for //: 'Column' and 'Column'

Обычно я использую // в Python 3.0+ и вернуть целочисленное значение, как я ожидал здесь, однако в дейтаграмме PySpark // не работает, а работает только /. По какой-то причине, почему это не работает? Мы должны использовать округленную функцию, чтобы получить целочисленное значение?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Не уверен в причине. но вы можете ввести приведение к int или использовать функцию Floor

from pyspark.sql import functions as F
tst= sqlContext.createDataFrame([(1,7,9),(1,8,4),(1,5,10),(5,1,90),(7,6,18),(0,3,11)],schema=['col1','col2','col3'])
tst1 = tst.withColumn("div", (F.col('col1')/F.col('col2')).cast('int'))
tst2 = tst.withColumn("div", F.floor(F.col('col1')/F.col('col2')))
1 голос
/ 11 июля 2020

// (разделение этажей) не поддерживается в pyspark over column. Попробуйте альтернативу ниже -

counts = friendDataset.groupBy("age").count()
total = friendDataset.groupBy("age").agg(sum('numFriends').alias('sum'))
res = total.join(counts, "age").withColumn("Friend By Age", F.floor(F.col("sum") / F.col("count"))).drop('sum(numFriends)','count')

...