关于选择的火花数据框澄清

时间:2021-01-27 07:16:20

标签: dataframe apache-spark pyspark

我创建了一个数据框 ordersDF。下面是架构。

root
 |-- order_id: long (nullable = true)
 |-- order_date: string (nullable = true)
 |-- order_customer_id: long (nullable = true)
 |-- order_status: string (nullable = true)
 

在某些地方我们使用'order_id'、order_id、ordersDF.order_id。什么时候使用哪一个真的很混乱。 例如。

1)ordersDF.select(order_id).show() -- NameError: name 'order_id' is not defined
 ordersDF.where('order_id==9').show() --No error here
 
 2)ordersDF.select('order_id').show() --No error here
 
 3)ordersDF.select(ordersDF.order_id).show()--No error here
 
 4)ordersDF.where('ordersDF.order_id==9').show() --AnalysisException: cannot resolve '`ordersDF.order_id`' given input columns: [order_customer_id, order_date, order_id, order_status]; line 1 pos 0;

2 个答案:

答案 0 :(得分:0)

据我所知,您在传递列时感到困惑。
使用不带任何 DF.ColumnName' 或在单引号(如 'order_id')下传递列名。您可以使用这些方法中的任何一种来传递列。

这应该可以解决您的问题。

答案 1 :(得分:0)

select 和 where 函数将字符串或列对象作为输入。你把它们混在一起。

1a) 您想访问一个列,该列是 Python 中变量 order_id 的名称。但是,您没有定义变量。这是传递一个字符串。
1b) 这是 spark SQL,列 order_id 应该是 9。这转化为 select * from ordersDF where order_id=9。这是传递一个字符串。
2)选择列的Spark sql,类似1a。转换为 select order_id from ordersDF。这是传递一个字符串。
3) 在这里你通过 DF.column
传递一个列对象 4) 在这里传递一个字符串,它不是列名。 Spark 实际上可以在列名中包含 . (但如果将其保存到 hive 则不行)。所以它正在寻找一个不存在的列。请注意,如果您无论如何都想使用表名,则可以使用别名。 ordersDF.alias("ordersDF").select("ordersDF.orderId") 有效。