在pyspark数据帧中,当我重命名列时,以前的名称仍然可以用于筛选.Bug或功能



我使用包含字符串类型列的PySpark数据帧处理DataBricks。我使用.withColumnRenamed((重命名其中一个。在这个过程的后面,我使用.filter((来选择包含某个子字符串的行。我不小心使用了旧列名,它仍然运行过滤器,并产生了"正确"的结果,就像我使用了新列名一样。我的问题是:这是一个bug还是一个功能?

我在一个简单的情况下重现了这个问题:

_test = sqlContext.createDataFrame([("abcd","efgh"), ("kalp","quarto"), ("aceg","egik")], [ 'x1', 'x2'])
_test.show()
+----+------+
|  x1|    x2|
+----+------+
|abcd|  efgh|
|kalp|quarto|
|aceg|  egik|
+----+------+
_test2 = _test.withColumnRenamed('x1', 'new')
_test2.filter("x1 == 'aceg'").show()
+----+----+
| new|  x2|
+----+----+
|aceg|egik|
+----+----+
_test2.filter("substring(x1,1,2) == 'ka'").show()
+----+------+
| new|    x2|
+----+------+
|kalp|quarto|
+----+------+

由于列x1不再存在于"_test2";。奇怪的是,输出显示了新名称('new'(。

另一个例子:

_test2.filter("substring(x1,1,1) == 'a'").show()

给出

+----+----+
| new|  x2|
+----+----+
|abcd|efgh|
|aceg|egik|
+----+----+

CCD_ 1给出

+----+----+
| new|  x2|
+----+----+
|abcd|efgh|
+----+----+

但是,_test2.select(['x1', 'x2']).show()将抛出一个"x1"不存在的错误。

这是Spark的已知问题。社区决定不修复它。有关详细信息,请参阅此相关的jira。

最新更新