【问题标题】:Save data as text file from spark to hdfs将数据作为文本文件从 spark 保存到 hdfs
【发布时间】:2016-07-28 05:03:28
【问题描述】:

我使用pySparksqlContext 使用以下查询处理数据:

(sqlContext.sql("select LastUpdate,Count(1) as Count" from temp_t)
           .rdd.coalesce(1).saveAsTextFile("/apps/hive/warehouse/Count"))

按以下格式存储:

Row(LastUpdate=u'2016-03-14 12:27:55.01', Count=1)
Row(LastUpdate=u'2016-02-18 11:56:54.613', Count=1)
Row(LastUpdate=u'2016-04-13 13:53:32.697', Count=1)
Row(LastUpdate=u'2016-02-22 17:43:37.257', Count=5)

但我想将数据存储在 Hive 表中

LastUpdate                           Count

2016-03-14 12:27:55.01                   1
.                                        .
.                                        .

这是我在 Hive 中创建表的方式:

CREATE TABLE Data_Count(LastUpdate string, Count int )
ROW FORMAT DELIMITED fields terminated by '|';

我尝试了很多选项,但都没有成功。请帮我解决这个问题。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql apache-hive


    【解决方案1】:

    为什么不将数据加载到 Hive 本身,而不经过保存文件然后将其加载到 hive 的过程。

    from datetime import datetime, date, time, timedelta
    hiveCtx = HiveContext(sc)
    
    #Create sample data
    currTime = datetime.now()
    currRow = Row(LastUpdate=currTime)
    delta = timedelta(days=1)
    futureTime = currTime + delta
    futureRow = Row(LastUpdate=futureTime)
    lst = [currRow, currRow, futureRow, futureRow, futureRow]
    
    #parallelize the list and convert to dataframe
    myRdd = sc.parallelize(lst)
    df = myRdd.toDF()
    df.registerTempTable("temp_t")
    aggRDD = hiveCtx.sql("select LastUpdate,Count(1) as Count from temp_t group by LastUpdate")
    aggRDD.saveAsTable("Data_Count")
    

    【讨论】:

    • 谢谢,使用相同的方法..但数据存储为 2016-03-14 12:27:55.01 1 2016-02-18 11:56:54.613 1 不是表格格式.. . 列名,我不能像我们在表 ex 上那样查询:dl 命令
    • 能否请您发布一个在这里不起作用的示例 dl 命令?
    【解决方案2】:

    您创建了一个表格,现在您需要用您生成的数据填充它。

    我相信这可以从 Spark HiveContext 运行

    LOAD DATA INPATH '/apps/hive/warehouse/Count' INTO TABLE Data_Count
    

    或者,您可能希望在数据上构建一个表

    CREATE EXTERNAL TABLE IF NOT Exists Data_Count(
        LastUpdate DATE, 
        Count INT
       ) 
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '|'
    STORED AS TEXTFILE
    LOCATION '/apps/hive/warehouse/Count';
    

    【讨论】:

    • 我将结果存储到 spark 中的一个变量(例如:result)中,运行上述查询后,当我执行 result.show()...数据以管道作为分隔符显示在 2 列中时。是的,我做了“LOAD DATA INPATH '/apps/hive/warehouse/Count' INTO TABLE Data_Count”,但结果在一列“LastUpdate”下显示日期和计数,而另一列“Count”显示为 NULL。
    • 当你显示一个 RDD 时,它会用管道格式化。它不会使用管道将数据保存到文本文件中。您可以对 HDFS 文件进行分类以检查实际的分隔符。您在第二列中得到空值,因为所有内容都被推到第一列
    • 您好,已检查..它由“,”分隔,当我相应地更改您的查询并现在执行时,我将两列都设为 NULL
    猜你喜欢
    • 2020-08-18
    • 2017-10-10
    • 1970-01-01
    • 2018-06-22
    • 2017-06-14
    • 2012-08-10
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多