Apache spark 在spark shell中编写.csv文件的查询

Apache spark 在spark shell中编写.csv文件的查询,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,谁能告诉我如何使用spark shell for.csv文件编写查询 我所取得的成就是使用DataRicks库读取.csv文件并创建一个dataframe,如下所示: ./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.forma

谁能告诉我如何使用spark shell for.csv文件编写查询

我所取得的成就是使用DataRicks库读取.csv文件并创建一个dataframe,如下所示:

./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操作。但我想知道我如何写一些查询

我在上看到了说明,它提到了一些关于以编程方式指定模式的内容,我遵循了它的过程,只是读取.csv文件而不是textfile,但是当我执行val rowRDD=people.map\uuz.split.mapp=>Rowp0,p1.trim时,我收到一个错误,说value split不是org.apache.spark.sql.Row的成员。我如何解决这个问题

如果有更简单的方法来编写sql查询,请告诉我。我最终想做的是选择两列,一列表示id,一列表示价格,然后返回最高价格,就这么简单

df.printSchema如下所示:

|-TAXROLL\u编号:字符串可空=真 |-建筑名称:字符串nullable=true

|-评估值:字符串可空=真

|-街道名称:字符串nullable=true

|-邮政编码:字符串nullable=true

|-城市:字符串nullable=true

|-生成年份:字符串nullable=true

|-Lon:string nullable=true


|-Lat:string nullable=true

我不确定我是否完全理解您的意思,但您可能只需要

df.registerTempTable("TblName") //temp 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")
此方法不需要使用DataRicks csv包。另一方面,如果您的数据有一些封装和转义字符,那么最好使用CSV包。

Java Code Spark 2.0.0

    package com.example.SparkReadFile;

    import org.apache.spark.sql.Dataset;
    import org.apache.spark.sql.Row;
    import org.apache.spark.sql.SparkSession;
    import org.apache.spark.sql.functions;


    public class Driver 
    {
        public static void main(String[] args) throws Exception {
            SparkSession spark = SparkSession
                   .builder()
                   .appName("Csv reader")
                   .master("local")
                  // .enableHiveSupport()
                   .getOrCreate();
            Dataset<Row> df = spark.read()
                   .format("csv")
                   .option("header", "true")
                   .option("nullValue", "")
                   .csv("file:///Users/karuturi/Desktop/sample.csv");

            df.registerTempTable("people"); //temp table registration

            Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");
            sqlDF.show();
            }
    }

您可以编辑问题并显示printSchema的输出吗?一旦有了一个有效的数据框架和一个有效的模式,就可以很好地进行查询了。如果你打印模式,我会告诉你如何打印。是的,我已经编辑了我的帖子
    package com.example.SparkReadFile;

    import org.apache.spark.sql.Dataset;
    import org.apache.spark.sql.Row;
    import org.apache.spark.sql.SparkSession;
    import org.apache.spark.sql.functions;


    public class Driver 
    {
        public static void main(String[] args) throws Exception {
            SparkSession spark = SparkSession
                   .builder()
                   .appName("Csv reader")
                   .master("local")
                  // .enableHiveSupport()
                   .getOrCreate();
            Dataset<Row> df = spark.read()
                   .format("csv")
                   .option("header", "true")
                   .option("nullValue", "")
                   .csv("file:///Users/karuturi/Desktop/sample.csv");

            df.registerTempTable("people"); //temp table registration

            Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");
            sqlDF.show();
            }
    }