如何使用列名称在Spark SQL中引用数据?

时间:2017-09-14 09:26:22

标签: scala apache-spark apache-spark-sql

如果我有一个名为$.ajax({ url: location.origin+'/getcat?t='+id, dataType:"json" }).success(function(data){ var array = data.data; array.forEach(function(print){ // camelCase it console.log(print.title); }); // You forgot to add this close block. I guess you have it elsewhere in your code. }); 的文件,其中包含以下数据:

shades.txt

我可以将它存储在SparkSQL中,如下所示:

1 | 1 | dark red
2 | 1 | light red
3 | 2 | dark green
4 | 3 | light blue
5 | 3 | sky blue

但是当我尝试对它运行查询时

var shades_part = sc.textFile("shades.txt")
var shades_data = shades_part.map(line => line.split("\\|").map(elem => elem.trim))
shades_data.toDF().createOrReplaceTempView("shades_data")

我收到错误:

sqlContext.sql("select * from shades_data A where A.shade_name = "dark green")

2 个答案:

答案 0 :(得分:3)

您可以将代码的案例类用作

case class Shades(id: Int, colorCode:Int, shadeColor: String)

然后将代码修改为

var shades_part = sc.textFile("shades.txt")
var shades_data = shades_part.map(line => line.split("\\|")).map(elem => Shades(elem(0).trim.toInt, elem(1).trim.toInt, elem(2).trim))
val df = shades_data.toDF()

您应该将数据框设为

+---+---------+----------+
|id |colorCode|shadeColor|
+---+---------+----------+
|1  |1        |dark red  |
|2  |1        |light red |
|3  |2        |dark green|
|4  |3        |light blue|
|5  |3        |sky blue  |
+---+---------+----------+

现在您可以使用filter函数作为

df.filter($"shadeColor" === "dark green").show(false)

应该给你

+---+---------+----------+
|id |colorCode|shadeColor|
+---+---------+----------+
|3  |2        |dark green|
+---+---------+----------+

使用架构

您可以将架构创建为

val schema = StructType(Array(StructField("id", IntegerType, true), StructField("colorCode", IntegerType, true), StructField("shadeColor", StringType, true)))

并将sqlContext中的模式用作

val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("delimiter", "|")
  .schema(schema)
  .option("ignoreTrailingWhiteSpace", true)
  .option("ignoreLeadingWhiteSpace", true)
  .load("shades.txt")

或者您可以将createDataFrame功能用作

var shades_part = sc.textFile("shades.txt")
var shades_data = shades_part.map(line => line.split("\\|").map(_.trim)).map(elem => Row.fromSeq(Seq(elem(0).toInt, elem(1).toInt, elem(2))))
sqlContext.createDataFrame(shades_data, schema).show(false)

答案 1 :(得分:1)

检查数据帧的架构,您将知道列名称

val dataframe = shades_data.toDF()
dataframe.printSchema()

如果在创建数据框时没有定义列名,则默认情况下它将使用_c0, _c1 ...作为列名。

或者您可以在创建如下所示的数据框时提供列名称

val dataframe = shades_data.toDF("col1", "col2", "col3")
dataframe.printSchema()

root
 |-- col1: integer (nullable = false)
 |-- col2: integer (nullable = false)
 |-- col3: string (nullable = true)