我创建了一个数据框 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;
答案 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")
有效。