我有一个场景,我需要使用 Pig 加载数据并存储到 hdfs 中,这个结果(pig 输出/部分文件数据)应该加载到两个mysql 中的表使用 Sqoop。
Sqoop可以做到吗?任何其他解决方案。
例如如果我有这样一个文件
col1 col2 col3 col4
.... .... .... ....
.... .... .... ....
.... .... .... ....
I want to export col1,col2 to table table1 and col3,col4 to table table 2 of some database
提前致谢。
最佳答案
我在下面的解决方案中使用了 MySQL,但同样适用于其他数据库。
在 HDFS 上创建以下平面文件:
$ hadoop fs -cat sqoop_export
W1, X1, Y1, Z1
W2, X2, Y2, Z2
W3, X3, Y3, Z3
在MySQL中创建两个表:
mysql> create table A (col1 VARCHAR(20), col2 VARCHAR(20));
Query OK, 0 rows affected (0.08 sec)
mysql> create table B (col3 VARCHAR(20), col4 VARCHAR(20));
Query OK, 0 rows affected (0.01 sec)
然后创建一个存储过程,它接受四个输入值,然后将前两个值插入第一个表,将最后两个值插入第二个表:
mysql> delimiter //
mysql> CREATE PROCEDURE insert_two_tables (IN c1 VARCHAR(20), IN c2 VARCHAR(20), IN c3 VARCHAR(20), IN c4 VARCHAR(20)) BEGIN INSERT INTO A(col1, col2) VALUES(c1, c2); INSERT INTO B(col3, col4) VALUES(c3, c4); END//
Query OK, 0 rows affected (0.04 sec)
现在使用 sqoop export 但不指定表名,而是使用 --call 选项调用上面创建的存储过程:
$ sqoop export --connect jdbc:mysql://localhost/sqoop_export --username xyz --password test --call insert_two_tables --export-dir sqoop_export
导出过程成功完成:
14/03/24 17:52:53 INFO mapred.JobClient: Physical memory (bytes) snapshot=668643328
14/03/24 17:52:53 INFO mapred.JobClient: Virtual memory (bytes) snapshot=7584153600
14/03/24 17:52:53 INFO mapred.JobClient: Total committed heap usage (bytes)=1175584768
14/03/24 17:52:53 INFO mapreduce.ExportJobBase: Transferred 691 bytes in 16.8329 seconds (41.0506 bytes/sec)
14/03/24 17:52:53 INFO mapreduce.ExportJobBase: Exported 3 records
现在验证这两个表是否包含我们要查找的数据:
mysql> select * from A;
+------+------+
| col1 | col2 |
+------+------+
| W3 | X3 |
| W2 | X2 |
| W1 | X1 |
+------+------+
3 rows in set (0.00 sec)
mysql> select * from B;
+------+------+
| col3 | col4 |
+------+------+
| Y3 | Z3 |
| Y2 | Z2 |
| Y1 | Z1 |
+------+------+
3 rows in set (0.00 sec)
因此使用存储过程,HDFS 上的一个平面文件可以导出到数据库上的多个表。
如果您不想使用存储过程,那么替代方案是使用 pig 在 HDFS 上创建两个平面文件 - 一个具有 col1、col2,另一个具有 col3、col4。然后您可以对每个平面文件分别执行两个 sqoop 导出到数据库中的相应表。
Sqoop 导出功能 --columns 选项,但这仅在数据库端相对于 HDFS 上的平面文件有更多列时才有用。从另一个方向来看,存储过程似乎是必要的。根据 SQOOP-749 Sqoop 1.4.3 及以上版本提供了调用存储过程而不指定表的能力。我在上面的例子中使用了 Hadoop 2.0.0 和 Sqoop 1.4.3。
关于hadoop - 从一个部分文件中 Sqoop 到两个表( pig 输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21936147/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋