Python dataframe中的pyspark进程表达式
我有一个员工的工资,想知道工资下降了多少桶Python dataframe中的pyspark进程表达式,python,apache-spark,pyspark,eval,pyspark-sql,Python,Apache Spark,Pyspark,Eval,Pyspark Sql,我有一个员工的工资,想知道工资下降了多少桶 salary=3000 规则表 rule_id,condtion,bucket 1,salary>1000,'A' 2,salary>2000,'B' 3,salary>3000,'C' 4,salary>4000,'D' 5,salary>5000,'E' 从以上两个表中,我想得出以下结果 rule_id,condtion,bucket,result 1,salary>1000,'A',True 2,salar
salary=3000
规则表
rule_id,condtion,bucket
1,salary>1000,'A'
2,salary>2000,'B'
3,salary>3000,'C'
4,salary>4000,'D'
5,salary>5000,'E'
从以上两个表中,我想得出以下结果
rule_id,condtion,bucket,result
1,salary>1000,'A',True
2,salary>2000,'B'True
3,salary>3000,'C',True
4,salary>4000,'D',False
5,salary>5000,'E',False
我尝试了python和spark
工资=3000
rules_df=sqlContext.read.format('com.databricks.spark.csv')。选项(header='true',inferschema='true')。加载('rule.csv'))
validate=规则和列('result',eval(规则和条件))
对于上面的代码,我得到下面的错误
Traceback (most recent call last):
File "C:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3296, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-129-a813eeada424>", line 1, in <module>
rules_df.withColumn('valid',eval(str(rules_df.condtion)))
File "<string>", line 1
Column<b'condtion'>
^
SyntaxError: unexpected EOF while parsing
回溯(最近一次呼叫最后一次):
文件“C:\Anaconda3\lib\site packages\IPython\core\interactiveshell.py”,第3296行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
规则与列('valid',eval(str(规则与条件)))
文件“”,第1行
纵队
^
SyntaxError:分析时出现意外的EOF
您需要使用udf
来执行eval
这里:
下面是数据帧:
+-------+-----------+------+
|rule_id| condtion|bucket|
+-------+-----------+------+
| 1|salary>1000| 'A'|
| 2|salary>2000| 'B'|
| 3|salary>3000| 'C'|
| 4|salary>4000| 'D'|
| 5|salary>5000| 'E'|
+-------+-----------+------+
现在我们定义一个udf
来显式解析列condition
:
salary = 3000
my_udf = F.udf(lambda c: eval(c, {'salary':salary}), BooleanType())
df = df.withColumn('result', my_udf('condtion'))
df.show()
+-------+-----------+------+------+
|rule_id| condtion|bucket|result|
+-------+-----------+------+------+
| 1|salary>1000| 'A'| true|
| 2|salary>2000| 'B'| true|
| 3|salary>3000| 'C'| false|
| 4|salary>4000| 'D'| false|
| 5|salary>5000| 'E'| false|
+-------+-----------+------+------+
我不确定你的规则表有多大,但如果不是太大
如果您只是尝试将规则表应用于单个数据点,
这可能不是实现这一目标的最有效方式。
只使用常规的python
和pandas
函数更容易
在大多数情况下,它更有可能将规则应用于很多很多数据