在spark-shell

时间:2016-03-28 17:20:21

标签: apache-spark apache-spark-sql

有谁能告诉我如何使用spark-shell为.csv文件编写查询?

我所取得的是使用databricks库读取.csv文件并创建一个数据帧,如下所示:

./spark-shell --packages.com.databricks:spark-csv_2.10:1.4.0
import org.apache.spark.sql.SQLContext
val sqlContect = new SQLContext(sc)
val df = sqlContext.read.format("com.databricks.spark.csv") .option("header", "true").load("mylocalpath.csv")

然后我可以毫无问题地执行df.printSchema()和其他datafram操作。但我想知道如何写一些查询?

我在http://spark.apache.org/docs/latest/sql-programming-guide.html上看到了指令并且它提到了一些关于以编程方式指定架构的内容,我按照它的步骤来阅读文本文件的.csv文件,但当我val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))时,我得到了一个错误,说值拆分不是org.apache.spark.sql.Row的成员。我该如何解决这个问题?

如果有更简单的方法来编写SQL查询,请告诉我。我最终想要做的就是选择两列,一个用于id,一个用于价格,并且尽可能简单地回收最高价格。

df.printSchema()如下所示:

|-- TAXROLL_NUMBER: string (nullable = true)
 |-- BUILDING_NAME: string (nullable = true)

|-- ASSESSED_VALUE: string (nullable = true)

|-- STREET_NAME: string (nullable = true)

|-- POSTAL_CODE: string (nullable = true)

|-- CITY: string (nullable = true)

|-- BUILD_YEAR: string (nullable = true)

|-- Lon: string (nullable = true)

|-- Lat: string (nullable = true)

2 个答案:

答案 0 :(得分:2)

我不确定我是否完全跟随你,但也许你需要的只是

df.registerTempTable("TblName") //temp table registration

df.saveAsTable("TblName") //actual physical table registration

并使用

进行查询
sqlContext.sql("select * from TblName limit 100").take(100).foreach(println)

或任何其他spark-sql查询。

我认为您的问题是因为在使用spark-csv软件包读取CSV后尝试进行RDD工作。此包返回的类型如您所述 - org.apache.spark.sql.Row。 您可以轻松使用RDD方法 - 只需使用textFile读取csv文件即可。例如:

case class tmpSchema(TAXROLL_NUMBER: String,  BUILDING_NAME: String, ASSESSED_VALUE: String, STREET_NAME: String, CITY: String) // etc.   
val toTable = sc.textFile(pathString).map(_.split(",")).map(p => tmpSchema(p(0), p(1) ,p(2), p(3), p(4)). toDF.registerTempTable("tblName2")

此方法不需要使用databricks csv包。另一方面,如果您的数据有一些封装和转义字符 - 您最好使用CSV包。

答案 1 :(得分:0)

Java Code Spark 2.0.0

let dic : [String: AnyObject?] = [
    "Name": someString_Variable as NSString,
    "Sum":  someUInt64_Variable as NSNumber
]