Python PySpark使用另一个数据集中的值计算存储在数据集列中的公式

Python PySpark使用另一个数据集中的值计算存储在数据集列中的公式,python,pyspark,dataset,Python,Pyspark,Dataset,我有一个在列中存储公式的数据集(main): ID | Formula 1 (a/(b+c))*100 2 m/n*100 3 d 以及另一个包含以下值的数据集(val): ID | Value a 4 b 3 c 8 d 7 m 2 n 5 我需要使用val数据集中的值计算公式,并将结果保存到新的主列中 我通过逐行迭代主数据集来实现这一点,创建一个变量,存储包含所有公式参数的列表,用值替换参数并进行计算。然后

我有一个在列中存储公式的数据集(main):

ID | Formula
1    (a/(b+c))*100
2    m/n*100
3    d
以及另一个包含以下值的数据集(val):

ID  |  Value
a      4
b      3
c      8
d      7
m      2
n      5
我需要使用val数据集中的值计算公式,并将结果保存到新的主列中

我通过逐行迭代主数据集来实现这一点,创建一个变量,存储包含所有公式参数的列表,用值替换参数并进行计算。然后我使用.withColumn将结果添加到主数据集中。 但对于大量数据而言,这根本不是最佳选择

你能不能帮我一个提示,告诉我如何在不逐行迭代的情况下做到这一点


谢谢大家!

公式中可以显示哪些函数,基于SQL还是基于Python?变量名是否可以是非字母数字,即下划线、点等?第二个数据帧的大小是多少,变量的数量是有限的还是庞大的列表?这些函数是基于SQL的。是变量名包含点,格式为:abcd.123。第二个数据帧包含大约40k行。无论如何,在匹配变量值之前,我需要使用4个条件来过滤第二个数据帧。在我看来,如果它们是Python代码,这会容易得多,因为我们可以使用
eval()
(尽管这可能不安全),SQL中没有这样的东西。变量名中的点将是一个问题,因为很难将它们与浮点数分开。从我的测试来看,对于simple+-*/,udf应该可以,数学函数如
sin()
pi
等,我得到了错误/空返回。在Spark上下文下使用导入的函数时,eval函数似乎无法正常工作。我必须对此进行更多检查..我设法用eval()完成了这项工作,并且它正在工作。但是在使用eval之前,我用值替换了代码:FormulaVal=FormulaCode.replace(code,str(value))。然后使用eval(FormulaVal)就可以了。有趣的是,当我在函数中显式导入这些数学函数时,我能够使它同时使用pandas_udf和udf。(从main导入时出现NameError,切换到基于rdd的map/mapPartition方法时出现相同错误)。因此,从我目前的测试来看,只要SQL函数或语法可以在Python中找到替代品,就应该能够使用基于Python的udf函数对其进行评估:)公式中可以显示哪些函数,基于SQL的还是基于Python的?变量名是否可以是非字母数字,即下划线、点等?第二个数据帧的大小是多少,变量的数量是有限的还是庞大的列表?这些函数是基于SQL的。是变量名包含点,格式为:abcd.123。第二个数据帧包含大约40k行。无论如何,在匹配变量值之前,我需要使用4个条件来过滤第二个数据帧。在我看来,如果它们是Python代码,这会容易得多,因为我们可以使用
eval()
(尽管这可能不安全),SQL中没有这样的东西。变量名中的点将是一个问题,因为很难将它们与浮点数分开。从我的测试来看,对于simple+-*/,udf应该可以,数学函数如
sin()
pi
等,我得到了错误/空返回。在Spark上下文下使用导入的函数时,eval函数似乎无法正常工作。我必须对此进行更多检查..我设法用eval()完成了这项工作,并且它正在工作。但是在使用eval之前,我用值替换了代码:FormulaVal=FormulaCode.replace(code,str(value))。然后使用eval(FormulaVal)就可以了。有趣的是,当我在函数中显式导入这些数学函数时,我能够使它同时使用pandas_udf和udf。(从main导入时出现NameError,切换到基于rdd的map/mapPartition方法时出现相同错误)。因此,从我目前的测试来看,只要SQL函数或语法可以在Python中找到替代品,就应该能够使用基于Python的udf函数对其进行评估:)