1、给定一个数据框,该数据框由 exo2_2_df = spark.createDataFrame( [['test', 'more test', 10_000_000_000]], ['one', 'two', 'three'] ) 代码创建,其中 createDataFrame() 可从多种数据源创建数据框。该数据框的结构信息如下: # root # |-- one: string (nullable = true) # |-- two: string (nullable = true) # |-- three: long (nullable = true) 。以编程方式计算不是字符串类型的列的数量。
只有一列不是字符串类型,即名为 ‘three’ 的列。因此不是字符串类型的列的数量为 1。
2、重写以下代码片段,移除 withColumnRenamed 方法,并比较哪个版本更清晰易读。代码如下:从 pyspark.sql.functions 导入 col 和 length 函数; length 函数返回字符串列中的字符数。exo2_3_df = ( spark.read.text(‘./data/gutenberg_books/1342-0.txt’) .select(length(col(‘value’))) .withColumnRenamed(‘length(value)’, ‘number_of_char’) )
移除 withColumnRenamed 方法后的代码如下:
from pyspark.sql.functions import col, length
exo2_3_df = (
spark.read.text('./data/gutenberg_books/1342-0.txt')
.select(length(col('value')).alias('number_of_char'))
)
通常,移除 withColumnRenamed 后的版本更清晰易读,因为它在选择列时直接完成了重命名,代码更简洁紧凑。
3、假设存在一个数据框 exo2_4_df,以下代码会报错。代码如下:从 pyspark.sql.functions 导入 col 和 greatest 函数,创建数据框 exo2_4_df,打印其架构,使用 greatest 函数选择最大的值并别名,然后再次选择列 ‘key’ 和 ‘max_value’ 。请指出问题是什么,如何解决?
问题在于代码中第二次调用 select 方法时使用了 'max_value' ,而之前使用 alias 方法设置的列名是 'maximum_value' ,列名不匹配导致错误。解决方法是将第二次 select 方法中的 'max_value' 改为 'maximum_value' 。修改后的代码如下:
from pyspark.sql.functions import col, greatest
from pyspark.sql.utils import AnalysisException
# 创建数据框
spark = SparkSession.builder.getOrCreate()
exo2_4_df = spark.createDataFrame( [['key', 10_000, 20_000]], ['key', 'value1', 'value2'])
# 打印数据框架构
exo2_4_df.printSchema()
try:
exo2_4_mod = exo2_4_df.select( greatest(col('value1'), col('value2')).alias('maximum_value') ).select('key', 'maximum_value') # 修改列名
exo2_4_mod.show()
except AnalysisException as err:
print(err)

最低0.47元/天 解锁文章
13

被折叠的 条评论
为什么被折叠?



