读取spark dataframe中的配置单元表(不带标头)

w8f9ii69  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(397)

我有下面的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|
+----+----+-----+

我最终得到了sparkDataframe中的头。有没有一个简单的方法来消除它?
另外,我在将表读入Dataframe时是否遗漏了什么(理想情况下,我不应该得到正确的标题?)?

6yoyoihd

6yoyoihd1#

您必须从结果中删除标题。你可以这样做:

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|
+---+----+---+

谢谢。

wribegjk

wribegjk2#

你可以用 skip.header.line.count 跳过此标题。也可以在创建表时指定相同的值。例如:

create external table testtable ( id int,name string, age int)
row format delimited .............
tblproperties ("skip.header.line.count"="1");

之后加载数据,然后检查您的查询,我希望您将得到预期的输出。

z9smfwbn

z9smfwbn3#

虽然不是最优雅的方式,但Pypark也能做到:

rddWithoutHeader = dfemp.rdd.filter(lambda line: line!=header) 
dfnew = sqlContext.createDataFrame(rddWithoutHeader)

相关问题