我正在向dataproc发出一个spark-sql作业,只显示表中的一些数据:
gcloud dataproc jobs submit spark-sql --cluster mycluster --region europe-west1 -e "select * from mydb.mytable limit 10"
当返回数据并输出到stdout时,我没有看到列标题,我只看到原始数据,空格分隔。我真的希望输出格式更好,特别是我想看列标题。我试过这个:
gcloud dataproc jobs submit spark-sql --cluster mycluster --region europe-west1 -e "SET hive.cli.print.header=true;select * from mydb.mytable limit 10"
但它没有任何影响。
有没有办法让spark-sql在dataproc上显示列标题?
如果有办法像这样显示数据:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jim |
| 2 | Ann |
| 3 | Simon |
+----+-------+
然后那会更好。
答案 0 :(得分:1)
我一直在使用Dataproc集群执行一些测试,看起来无法使用Spark SQL检索具有列名的查询结果。但是,这更像是一个Apache Spark SQL问题,而不是Dataproc,所以我也将这个标记添加到你的问题中,以便它得到更好的关注。
如果您进入Dataproc集群中的Spark SQL控制台(通过在主服务器中进行SSH连接并键入spark-sql
),您将看到 SELECT 查询的结果不包括表名:
SELECT * FROM mytable;
18/04/17 10:31:51 INFO org.apache.hadoop.mapred.FileInputFormat: Total input files to process : 3
2 Ann
1 Jim
3 Simon
如果使用SELECT ID FROM mytable;
,则没有变化。因此,问题不在gcloud dataproc jobs sbmit spark-sql
命令中,而在于Spark SQL不提供此类数据。
如果您不一定要使用Spark SQL,可以尝试使用using HIVE。 HIVE确实提供了您想要的信息类型(包括列名称和更漂亮的格式):
user@project:~$ gcloud dataproc jobs submit hive --cluster <CLUSTER_NAME> -e "SELECT * FROM mytable;"
Job [JOB_ID] submitted.
Waiting for job output...
+-------------+---------------+--+
| mytable.id | mytable.name |
+-------------+---------------+--+
| 2 | Ann |
| 1 | Jim |
| 3 | Simon |
+-------------+---------------+--+
Job [JOB_ID] finished successfully.