我最近开始使用 pySpark。(在此之前我使用 Pandas)我想了解 Spark 如何在数据帧上执行和优化转换。
我可以使用带有数据框的一个变量一一进行转换吗?
#creating pyspark dataframe
from datetime import datetime, date
import pandas as pd
from pyspark.sql import Row
from pyspark.sql.functions import col,lit
df = spark.createDataFrame([
Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0)),
Row(a=4, b=5., c='string3', d=date(2000, 3, 1), e=datetime(2000, 1, 3, 12, 0))
])
就像这里
的转换方式#1:
df1 = df
df1 = df1.withColumn("d", lit("new value"))
df1 = df1.withColumn("b", col("b") + 2)
df1 = df1.select("a","b","d")
或者我应该在一个变量赋值中使用所有转换?
像这里
的转换方式#2:
df2 = (
df.withColumn("d", lit("new value"))
.withColumn("b", col("b") + 2)
.select("a","b","d")
)
方式#1对我来说更清楚。我对 Pandas 使用了相同的逻辑。
但据我所知,RDD,即在 Spark 数据帧下 - 不可变
这意味着,当我进行变量分配时,Spark 每次都会创建新的 RDD?
从这个逻辑来看,我应该使用 Way#2 来节省内存?
或者也许我应该兑现数据框?还是 Spark 优化了这一步?
很高兴了解考拉在这种情况下也是如何工作的