我试图将代码分散到单独的文件中以提高可读性,并且遇到了在导入的文件中引用未定义的全局名称的麻烦。是否有比调用时将所有必要的值有意传递给函数更好的解决方案?
我的代码当前是这样的:
#foo.py
import bar
def main():
a = 1
b = bar.Bar()
while True:
a += 1
b.incr()
print a
print b.c
if __name__ == '__main__':
main()
#END foo.py
Run Code Online (Sandbox Code Playgroud)
--
#bar.py
class Bar:
def __init__(self):
self.c = 0
def incr(self):
self.c += a
#END bar.py
Run Code Online (Sandbox Code Playgroud)
它给我NameError:全局名称'a'未定义。我需要像这样重写main():
def main():
b = new bar.Bar()
while True:
a += 1
b.incr(a)
print a
print b.c
Run Code Online (Sandbox Code Playgroud)
然后像这样重写incr():
def incr(self,a):
c += a
Run Code Online (Sandbox Code Playgroud)
或者,还有更好的方法?
作为记录,上面的代码被大量抽象。实际的代码包含大量的类和函数,这些类和函数传递许多类型的变量,包括一些大型词典。
提前致谢!
如果我有一个名为df的DataFrame看起来像:
+---+---+
| a1+ a2|
+---+---+
|foo|bar|
|N/A|baz|
+---+---+
Run Code Online (Sandbox Code Playgroud)
我期望从:
val df2 = df.withColumn("a1", when($"a1" == "N/A", $"a2))
Run Code Online (Sandbox Code Playgroud)
df2看起来像:
+---+---+
| a1+ a2|
+---+---+
|foo|bar|
|baz|baz|
+---+---+
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
error: type mismatch;
found : Boolean
required: org.apache.spark.sql.Column
Run Code Online (Sandbox Code Playgroud)
因此,听起来我需要一个在DataFrame的withColumn方法中产生其值的Column方法。
有任何类似的事情,或者其他方法来用当前列的值有条件地填充withColumn的替换参数吗?
如果我有一个名为df的DataFrame看起来像:
+----+----+
| a1+ a2|
+----+----+
| foo| bar|
| N/A| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)
我可以像这样有选择地替换值:
val df2 = df.withColumn("a1", when($"a1" === "N/A", $"a2"))
Run Code Online (Sandbox Code Playgroud)
所以df2看起来像:
+----+----+
| a1+ a2|
+----+----+
| foo| bar|
| baz| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)
但是为什么我不能检查它是否为null,例如:
val df3 = df2.withColumn("a1", when($"a1" === null, $"a2"))
Run Code Online (Sandbox Code Playgroud)
这样我得到:
+----+----+
| a1+ a2|
+----+----+
| foo| bar|
| baz| baz|
| etc| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)
编辑:$“ a1” .isNull似乎不起作用。可能是因为我如何构造用于测试的数据框,如下所示?
val schema = StructType(
StructField("a1", StringType, false) ::
StructField("a2", StringType, false) :: Nil …Run Code Online (Sandbox Code Playgroud) scala dataframe apache-spark apache-spark-sql spark-dataframe