Tôi đang thử đoạn mã sau để thêm một số vào mỗi hàng trong RDD và trả về danh sách RDD bằng PySpark.
từ pyspark.context nhập SparkContext
file = "file:///home/sree/code/scrap/sample.txt"
sc = SparkContext('local', 'TestApp')
dữ liệu = sc.textFile(file)
chia tách = [data.map(lambda p : int(p) + i) for i in range(4)]
in tách [0].collect()
in tách [1].collect()
in tách [2].collect()
Nội dung của tệp đầu vào (sample.txt) là:
1
2
3
Tôi đang mong đợi kết quả đầu ra như thế này (thêm các số trong rdd lần lượt là 0, 1, 2):
[1,2,3]
[2,3,4]
[3,4,5]
Và sản lượng thực tế là:
[4, 5, 6]
[4, 5, 6]
[4, 5, 6]
Điều này có nghĩa là đạo hàm chỉ sử dụng giá trị 3 của biến i, bất kểPhạm vi(4).
Tại sao hành vi này xảy ra?
Điều này xảy ra do liên kết muộn của Python, không phải do (Py)Spark cụ thể. Tôi
当lambda p : int(p) + i
sẽ được tra cứu khi nó được sử dụng chứ không phải khi nó được xác định. Thông thường, điều này có nghĩa là khi nó được gọi, nhưng trong bối cảnh cụ thể này, đó là khi nó được tuần tự hóa để gửi cho nhân viên.
Ví dụ: bạn có thể làm điều này:
định nghĩa f(i):
định nghĩa _f(x):
thử:
trả về int(x) + i
ngoại trừ:
vượt qua
trả lại _f
data = sc.parallelize(["1", "2", "3"])
chia tách = [data.map(f(i)) cho i trong phạm vi (4)]
[rdd.collect() cho rdd theo phần tách]
## [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
Tôi là một lập trình viên xuất sắc, rất giỏi!