apachespark和groupBy与Python的关联

2024-06-07 14:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python和apachespark的新手,我试图理解pyspark.sql.functions函数.corr(val1,val2)“工程。你知道吗

我有汽车品牌,年龄和价格的大数据框。我想得到每个汽车品牌的年龄和价格之间的相关性。你知道吗

我有两个解决方案:

//get all brands    
get_all_maker = data.groupBy("brand").agg(F.count("*").alias("counts")).collect()

for row in get_all_maker:
    print(row["brand"],": ",data.filter(data["brand"]==row["brand"]).corr("age","price"))

这个解决方案很慢,因为我经常使用“corr”。你知道吗

所以我试着用一个聚合:

get_all_maker_corr = data.groupBy("brand").agg(
    F.count("*").alias("counts"),
    F.corr("age","price").alias("correlation")).collect()

for row in get_all_maker_corr:
    print(row["brand"],": ",row["correlation"])

如果我尝试比较结果,它们是不同的。但为什么呢?你知道吗


Tags: datagetcountalias价格all解决方案agg
1条回答
网友
1楼 · 发布于 2024-06-07 14:34:54

我举了一些简单的例子。这里我生成简单的数据帧:

d = [
    {'name': 'a', 'age': 1, 'price': 2},
    {'name': 'a', 'age': 2, 'price': 4},

    {'name': 'b', 'age': 1, 'price': 1},
    {'name': 'b', 'age': 2, 'price': 2}
]
b = spark.createDataFrame(d)

让我们测试两种方法:

#first version
get_all_maker = b.groupBy("name").agg(F.count("*").alias("counts")).collect()

print("Correlation (1st)") 
for row in get_all_maker:
    print(row["name"],"(",row["counts"],"):",b.filter(b["name"] == row["name"]).corr("age","price"))

#second version
get_all_maker_corr = b.groupBy("name").agg(
    F.count("*").alias("counts"),
    F.corr("age","price").alias("correlation")).collect()

print("Correlation (2nd)") 

for row in get_all_maker_corr:
    print(row["name"],"(",row["counts"],"):",row["correlation"])

他们两个都给了我相同的答案:

Correlation (1st)
b ( 2 ): 1.0
a ( 2 ): 1.0

让我们向数据框中添加另一个无值项:

d = [
    {'name': 'a', 'age': 1, 'price': 2},
    {'name': 'a', 'age': 2, 'price': 4},
    {'name': 'a', 'age': 3, 'price': None},

    {'name': 'b', 'age': 1, 'price': 1},
    {'name': 'b', 'age': 2, 'price': 2}
]
b = spark.createDataFrame(d)

在第一个版本中,您将得到以下结果:

Correlation (1st)
b ( 2 ): 1.0
a ( 3 ): -0.5

第二个版本给你带来了其他的结果:

Correlation (2nd)
b ( 2 ): 1.0
a ( 3 ): 1.0

我想,那数据帧过滤器使用corr函数将None值设置为0值。你知道吗

以及数据帧.groupBy在agg中使用F.corr函数时,函数将忽略None值。你知道吗

所以,这两种方法是不相等的。我不知道,如果这是一个bug或者Spark系统的一个特性,但是如果你想计算相关值,那么应该只使用没有值的数据。你知道吗

相关问题 更多 >

    热门问题