Spark hiện cung cấp các hàm được xác định trước có thể được sử dụng trong các khung dữ liệu và dường như chúng được tối ưu hóa cao. Câu hỏi ban đầu của tôi sẽ diễn ra nhanh hơn, nhưng tôi đã tự mình thử nghiệm và tìm thấy các hàm tia lửa nhanh hơn khoảng 10 lần trong một trường hợp. Có ai biết tại sao điều này là như vậy, và khi nào một udf sẽ nhanh hơn (chỉ cho các trường hợp mà một chức năng spark giống hệt nhau tồn tại)?Chức năng Spark so với hiệu năng UDF?
Đây là mã thử nghiệm của tôi (chạy trên Databricks ed cộng đồng): function
# UDF vs Spark function
from faker import Factory
from pyspark.sql.functions import lit, concat
fake = Factory.create()
fake.seed(4321)
# Each entry consists of last_name, first_name, ssn, job, and age (at least 1)
from pyspark.sql import Row
def fake_entry():
name = fake.name().split()
return (name[1], name[0], fake.ssn(), fake.job(), abs(2016 - fake.date_time().year) + 1)
# Create a helper function to call a function repeatedly
def repeat(times, func, *args, **kwargs):
for _ in xrange(times):
yield func(*args, **kwargs)
data = list(repeat(500000, fake_entry))
print len(data)
data[0]
dataDF = sqlContext.createDataFrame(data, ('last_name', 'first_name', 'ssn', 'occupation', 'age'))
dataDF.cache()
UDF:
concat_s = udf(lambda s: s+ 's')
udfData = dataDF.select(concat_s(dataDF.first_name).alias('name'))
udfData.count()
Spark Chức năng:
spfData = dataDF.select(concat(dataDF.first_name, lit('s')).alias('name'))
spfData.count()
Ran cả nhiều lần, udf thường mất khoảng 1,1 - 1,4 s và chức năng spark concat luôn dưới 0,15 giây.
câu trả lời Fantastic, chỉ là những gì tôi đang tìm kiếm. Tôi nghi ngờ nó là do dữ liệu xáo trộn giữa Python-Java, chỉ là không chắc chắn. Tôi đánh giá cao thông tin bổ sung mà chúng cũng có thể được hưởng lợi từ Chất xúc tác và Vonfram vì vậy nó sẽ quan trọng hơn nhiều đối với tôi để thực hiện chúng nhiều nhất có thể trong mã của tôi và giảm thiểu UDF. Một chút tắt chủ đề, nhưng bạn sẽ xảy ra để biết nếu khả năng numpy đang đến Spark Dataframes bất cứ lúc nào sớm? Điều này đã giữ một trong những dự án của tôi phần lớn về RDD. – alfredox
Tôi không chắc chắn chính xác bạn có ý nghĩa gì bởi "khả năng gọn gàng". – zero323
Bạn không thể thêm một mảng numpy làm thành phần hàng. Hiện tại Spark Rows hỗ trợ các kiểu dữ liệu khác nhau như StringType, BoolType, FloatType, nhưng bạn không thể lưu một mảng numpy trong đó. – alfredox