Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala spark shell Unix时间戳转换&;将文件保存为其他格式_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala spark shell Unix时间戳转换&;将文件保存为其他格式

Scala spark shell Unix时间戳转换&;将文件保存为其他格式,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我刚开始学习Spark和Scala。我想知道如何在spark shell中使用这种从Unix时间戳到数据的转换方法 scala> val allrecords = sqlContext.sql("SELECT * FROM table") scala> allrecords.show() +----------+------------+ | timestamp|endtimestamp| +----------+------------+ |1462627176| 1462635

我刚开始学习Spark和Scala。我想知道如何在spark shell中使用这种从Unix时间戳到数据的转换方法

scala> val allrecords = sqlContext.sql("SELECT * FROM table")
scala> allrecords.show()
+----------+------------+
| timestamp|endtimestamp|
+----------+------------+
|1462627176|  1462635408|
|1462627742|  1462635629|
|1462628184|  1462635203|
它只显示前20行。为什么spark shell只显示20行?是否可以取消此限制

还有一个问题,如何将结果保存到我的主目录和HDFS位置

默认情况下,
show()
方法是
show(20,truncate=True)
,其中第一个参数是要显示的行数,第二个参数将输出截断为20行

因此,您只需使用
show()
show(,False)
即可显示所有行。
要保存
数据帧
,您可以使用
allrecords.write().format(“拼花”).save(“HDFSPath”)


allrecords.write.parquet(“HDFSPath\u filename.parquet”)

它不是spark shell限制,您可以调用show,并显示所需的行数,如下所示

allrecords.show(100)
要将结果保存在主目录中,只需将dataframe转换为rdd,并对其调用saveAsTextFile操作,如下所示

     allrecords.rdd.saveAsTextFile("path_where_save_file")
您还可以使用saveAsTextFile操作将文件保存在hdfs中

val allrecords = sqlContext.sql("SELECT FROM_UNIXTIME(timestamp/1000,'%Y-%M-%d) as timestamp, FROM_UNIXTIME(endtimestamp/1000,'%Y-%M-%d) as endtimestamp FROM table")


这可以将毫秒转换为日期

,但这将再次将数据帧转换为RDD,并且它将丢失与之相关的任何架构。是的,但您以后只需使用它来保存文件,就可以将相同的数据帧用于其他操作,或者您只需读取该文件并使用schemaYea创建数据帧,但这是一次又一次地重复整个过程。是的,你是对的@Yankee,但我们可以使用相同的数据帧进行进一步的操作,我们只需要在需要时将文件作为df读取,但是的,你是对的,这也很大程度上取决于用例。:)感谢Sandeep的宝贵评论我收到以下消息
org.apache.spark.sql.AnalysisException:无法解析给定输入列的“
timestamp`:[];第1行位置21“这一行从我
val allrecords=sqlContext.sql(“从表中选择时间戳为unixtime(时间戳,%Y-%M-%d)”)
Thanksys我将其称为
yourTable
在您的案例中,表名是
table
我还需要从这个查询中转换endtimestamp的另一个帮助,我给出的是
val allrecords=sqlContext.sql(“从unixtime(timestamp,endtimestamp“%Y-%M-%d”)中选择作为时间戳,从表中选择endtimestamp”)'
scala>val allrecords=sqlContext.sql(“从unixtime(时间戳,endtimestamp“%Y-%M-%d”)中选择时间戳,从表中选择endtimestamp”)org.apache.spark.sql.catalyst.parser.ParseException:endtimestamp类型的文本当前不受支持。(第1行,位置31)==sql==SELECT from unixtime(时间戳,endtimestamp“%Y-%M-%d”)作为timestamp,endtimestamp来自表'@toofreellik这一个没有选择表,这是由于括号引起的,您的回答告诉了我一个方法…感谢您给我清晰的图片。我试图使用这个allrecords.rdd.saveAsTextFile('hdfs://master:8020/location ")我能看到的是,所有的结果文件都被分割成几个部分…有没有办法将结果合并成单个txt文件现在文件就像部分-00000部分-00001部分-00002所以N,我的输入是从HDFS加载的txt文件。显然,它们会被分割,因为你已经将RDD保存为文本文件,RDD应该分布在集群中。要将其保存为单个文本文件,必须使用
coalesce
减少分区数。但这将洗牌的数据,这是一个昂贵的操作。您可以简单地使用通过提供目录路径创建的多个文件,这将是一个更好的选择,然后将它们组合成一个巨大的单个文件。您可以在回答问题时将答案标记为已接受。这与coalesce用于保存拼花地板文件是一样的。你能给我举个例子吗?是的,要得到一个拼花地板文件,你必须先把你的RDD合并起来。这里有一个关于如何合并的链接。val allrecords1=allrecords.coalesce(1)您的问题标题有误导性,请纠正它。这是我的最佳选择val allrecords=sqlContext.sql(“选择*,from_unixtime(timestamp,'yyyyy-MM-dd')作为时间戳,from_unixtime(endtimestamp,'yyyy-MM-dd')作为表中的endtimestamp”)这将转换这两个字段。。