我有以下Hive表:
select* from employee;
OK
abc 19 da
xyz 25 sa
pqr 30 er
suv 45 dr
当我在spark(pyspark)中读到这个时:
df = hiveCtx.sql('select* from spark_hive.employee')
df.show()
+----+----+-----+
|name| age| role|
+----+----+-----+
|name|null| role|
| abc| 19| da|
| xyz| 25| sa|
| pqr| 30| er|
| suv| 45| dr|
+----+----+-----+
我最终在我的spark DataFrame中获取了标题。有没有一种简单的方法可以删除它?
另外,我在将表格读入DataFrame时遗漏了一些东西(理想情况下我不应该正确地获取标题吗?)?
答案 0 :(得分:1)
您必须从结果中删除标头。你可以这样做:
scala> val df = sql("select * from employee")
df: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]
scala> df.show
+----+----+----+
| id|name| age|
+----+----+----+
|null|name|null|
| 1| abc| 19|
| 2| xyz| 25|
| 3| pqr| 30|
| 4| suv| 45|
+----+----+----+
scala> val header = df.first()
header: org.apache.spark.sql.Row = [null,name,null]
scala> val data = df.filter(row => row != header)
data: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [id: int, name: string ... 1 more field]
scala> data.show
+---+----+---+
| id|name|age|
+---+----+---+
| 1| abc| 19|
| 2| xyz| 25|
| 3| pqr| 30|
| 4| suv| 45|
+---+----+---+
感谢。
答案 1 :(得分:0)
您可以使用skip.header.line.count
跳过此标题。您也可以在创建表时指定相同的内容。例如:
create external table testtable ( id int,name string, age int)
row format delimited .............
tblproperties ("skip.header.line.count"="1");
之后加载数据,然后检查您的查询,我希望您将获得预期的输出。
答案 2 :(得分:-1)
不是最优雅的方式,但这适用于pyspark:
rddWithoutHeader = dfemp.rdd.filter(lambda line: line!=header)
dfnew = sqlContext.createDataFrame(rddWithoutHeader)