如何解决pyspark中sql函数的安全问题

如何解决pyspark中sql函数的安全问题,pyspark,google-bigquery,pyspark-sql,pyspark-dataframes,Pyspark,Google Bigquery,Pyspark Sql,Pyspark Dataframes,下面是在大查询环境中工作的查询 SELECT id,name, SAFE_CAST(value AS FLOAT64) as resultvalue from patienttable where SAFE_CAST(value AS FLOAT64) > 0 我需要使用python在spark环境中运行该查询 from pyspark.sql import SparkSession df = spark.read.parquet(path) df.createOrReplaceTe

下面是在大查询环境中工作的查询

SELECT id,name, SAFE_CAST(value AS FLOAT64) as resultvalue from patienttable 
where  SAFE_CAST(value AS FLOAT64) > 0
我需要使用python在spark环境中运行该查询

from pyspark.sql import SparkSession
df = spark.read.parquet(path)
df.createOrReplaceTempView("people")

df2=spark.sql("""SELECT id,name, SAFE_CAST(value AS FLOAT64) as resultvalue from patienttable 
where  SAFE_CAST(value AS FLOAT64) > 0""")
由于我们将大查询中使用的同一查询放在pyspark sql中,因此我们得到以下错误:

ERROR:root:An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))
在BigQuery中,安全强制转换用于防止错误强制转换。 在sparksql中,如果转换不可能,cast函数将返回null。在Spark中没有这样的安全功能

另外,您正在使用特定于Bigquery的FLOAT64,您应该只使用float。试试这个:

df2 = spark.sql("SELECT id, name, CAST(value AS FLOAT) AS resultvalue FROM patienttable WHERE CAST(value AS FLOAT) > 0")
这应该行得通

new_df = spark.sql("select id, name, cast(value as float) as resultvalue from patienttable WHERE value > 0")
如果您希望数据中有一个特定的小数点,请使用十进制b而不是浮点