我们可以在数据帧的每一行上使用 spark sql 函数吗?
Posted
技术标签:
【中文标题】我们可以在数据帧的每一行上使用 spark sql 函数吗?【英文标题】:Can we use the spark sql function on the each row of the dataframe? 【发布时间】:2019-09-23 15:21:32 【问题描述】:我们可以在数据帧的每一行上使用 SQL 函数吗? 例如 : 如果我们想在数据帧的行上应用 IF 内置 spark SQL 函数,有什么办法吗?
【问题讨论】:
你能提供一些代码并解释你到目前为止做了什么吗? 您能否再详细说明一下这个问题?原因是 - 即使您在 SQL 查询中使用if
函数,它也会应用于每一行。
【参考方案1】:
Spark SQL, Built-in Functions 不包括 IF,但有一些方法可以使用条件运算符。 示例代码展示了如何在 rdd 上映射并在每个值上应用 spark sql 条件运算符
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType, StructField, BooleanType
spark = SparkSession.builder.appName("Python Spark").getOrCreate()
data_sample = [[1, "r1", True], [2, "r2", False], [3, "r3", True], [4, "r4", False]]
data_schema = [StructField("id", IntegerType(), True), StructField("row", StringType(), True),
StructField("con", BooleanType(), True)]
data_frame = spark.createDataFrame(spark.sparkContext.parallelize(data_sample), StructType(data_schema))
result1 = data_frame.rdd.map(lambda r: r[0] > 1 and r[1] == "r2")
result2 = data_frame.rdd.map(lambda r: r[0] >= 1 and r[1] == "r2" and r[2])
print(result1.collect())
print(result2.collect())
输出
Picked up _JAVA_OPTIONS: -Xmx1024M
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
[False, True, False, False]
[False, False, False, False]
【讨论】:
是的,我们可以这样做,但我想使用不同的 SQL 函数,例如 to_date、Concat 等。我想对一行而不是数据框使用 spark SQL 操作。 Spark SQL 确实有IF
。阅读this以上是关于我们可以在数据帧的每一行上使用 spark sql 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章