http://git-wip-us.apache.org/repos/asf/arrow-site/blob/3cd84682/build/assets/javascripts/bootstrap/tab.js ---------------------------------------------------------------------- diff --git a/build/assets/javascripts/bootstrap/tab.js b/build/assets/javascripts/bootstrap/tab.js new file mode 100644 index 0000000..c4a8635 --- /dev/null +++ b/build/assets/javascripts/bootstrap/tab.js @@ -0,0 +1,155 @@ +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery);
http://git-wip-us.apache.org/repos/asf/arrow-site/blob/3cd84682/build/assets/javascripts/bootstrap/tooltip.js ---------------------------------------------------------------------- diff --git a/build/assets/javascripts/bootstrap/tooltip.js b/build/assets/javascripts/bootstrap/tooltip.js new file mode 100644 index 0000000..e35d9c7 --- /dev/null +++ b/build/assets/javascripts/bootstrap/tooltip.js @@ -0,0 +1,520 @@ +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); http://git-wip-us.apache.org/repos/asf/arrow-site/blob/3cd84682/build/assets/javascripts/bootstrap/transition.js ---------------------------------------------------------------------- diff --git a/build/assets/javascripts/bootstrap/transition.js b/build/assets/javascripts/bootstrap/transition.js new file mode 100644 index 0000000..db76596 --- /dev/null +++ b/build/assets/javascripts/bootstrap/transition.js @@ -0,0 +1,59 @@ +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); http://git-wip-us.apache.org/repos/asf/arrow-site/blob/3cd84682/build/blog/2017/05/07/0.3-release-japanese/index.html ---------------------------------------------------------------------- diff --git a/build/blog/2017/05/07/0.3-release-japanese/index.html b/build/blog/2017/05/07/0.3-release-japanese/index.html new file mode 100644 index 0000000..20aaabd --- /dev/null +++ b/build/blog/2017/05/07/0.3-release-japanese/index.html @@ -0,0 +1,288 @@ +<!DOCTYPE html> +<html lang="en-US"> + <head> + <meta charset="UTF-8"> + <title>Apache Arrow Homepage</title> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="generator" content="Jekyll v3.4.3"> + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> + <link rel="icon" type="image/x-icon" href="/favicon.ico"> + + <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900"> + + <link href="/css/main.css" rel="stylesheet"> + <link href="/css/syntax.css" rel="stylesheet"> + <script src="https://code.jquery.com/jquery-3.2.1.min.js" + integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" + crossorigin="anonymous"></script> + <script src="/assets/javascripts/bootstrap.min.js"></script> + + <!-- Global Site Tag (gtag.js) - Google Analytics --> +<script async src="https://www.googletagmanager.com/gtag/js?id=UA-107500873-1"></script> +<script> + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments)}; + gtag('js', new Date()); + + gtag('config', 'UA-107500873-1'); +</script> + + + </head> + + + +<body class="wrap"> + <div class="container"> + <nav class="navbar navbar-default"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#arrow-navbar"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/">Apache Arrow™ </a> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="arrow-navbar"> + <ul class="nav navbar-nav"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Project Links<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/install/">Install</a></li> + <li><a href="/blog/">Blog</a></li> + <li><a href="/release/">Releases</a></li> + <li><a href="https://issues.apache.org/jira/browse/ARROW">Issue Tracker</a></li> + <li><a href="https://github.com/apache/arrow">Source Code</a></li> + <li><a href="http://mail-archives.apache.org/mod_mbox/arrow-dev/">Mailing List</a></li> + <li><a href="https://apachearrowslackin.herokuapp.com">Slack Channel</a></li> + <li><a href="/committers/">Committers</a></li> + <li><a href="/powered_by/">Powered By</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Specification<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/docs/memory_layout.html">Memory Layout</a></li> + <li><a href="/docs/metadata.html">Metadata</a></li> + <li><a href="/docs/ipc.html">Messaging / IPC</a></li> + </ul> + </li> + + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Documentation<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/docs/python">Python</a></li> + <li><a href="/docs/cpp">C++ API</a></li> + <li><a href="/docs/java">Java API</a></li> + <li><a href="/docs/c_glib">C GLib API</a></li> + </ul> + </li> + <!-- <li><a href="/blog">Blog</a></li> --> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">ASF Links<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="http://www.apache.org/">ASF Website</a></li> + <li><a href="http://www.apache.org/licenses/">License</a></li> + <li><a href="http://www.apache.org/foundation/sponsorship.html">Donate</a></li> + <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li> + <li><a href="http://www.apache.org/security/">Security</a></li> + </ul> + </li> + </ul> + <a href="http://www.apache.org/"> + <img style="float:right;" src="/img/asf_logo.svg" width="120px"/> + </a> + </div><!-- /.navbar-collapse --> + </div> + </nav> + + + <h2> + Apache Arrow 0.3.0ãªãªã¼ã¹ + <a href="/blog/2017/05/07/0.3-release-japanese/" class="permalink" title="Permalink">â</a> + </h2> + + + + <div class="panel"> + <div class="panel-body"> + <div> + <span class="label label-default">Published</span> + <span class="published"> + <i class="fa fa-calendar"></i> + 07 May 2017 + </span> + </div> + <div> + <span class="label label-default">By</span> + <a href="http://wesmckinney.com"><i class="fa fa-user"></i> Wes McKinney (wesm)</a> + </div> + </div> + </div> + + <!-- + +--> + +<p><a href="/blog/2017/05/07/0.3-release/">åæï¼Englishï¼</a></p> + +<p>Apache Arrowãã¼ã ã¯0.3.0ã®ãªãªã¼ã¹ãã¢ãã¦ã³ã¹ã§ãã¦ããããã§ãã2æã«ãªãªã¼ã¹ãã0.2.0ãã10é±éã®æ´»çºãªéçºã®çµæãä»åã®ãªãªã¼ã¹ã§ãã<a href="https://github.com/apache/arrow/graphs/contributors"><strong>23人ã®ã³ã³ããªãã¥ã¼ã¿ã¼</strong></a>ã<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20ARROW%20AND%20status%20in%20(Resolved%2C%20Closed)%20AND%20fixVersion%20%3D%200.3.0"><strong>306åã®JIRAã®issueã解決</strong></a>ãã¾ããã</p> + +<p>è¤æ°ã®Arrowã®å®è£ ã«ããããã®æ°ããæ©è½ã追å ãã¦ãã¾ãã2017å¹´ãç¹ã«æ³¨åãã¦éçºããã®ã¯ãã¤ã³ã¡ã¢ãªã¼ç¨ã®ãã©ã¼ããããåã®ã¡ã¿ãã¼ã¿ãã¡ãã»ã¼ã¸ã³ã°ç¨ã®ãããã³ã«ã§ããããã¯ãããã°ãã¼ã¿ã¢ããªã±ã¼ã·ã§ã³ã«<strong>å®å®ãã¦ãã¦ãããã¯ã·ã§ã³ã§ä½¿ããåºç¤</strong>ãæä¾ããããã§ãã髿§è½IOã¨ã¤ã³ã¡ã¢ãªã¼ãã¼ã¿å¦çã«Arrowãæ´»ç¨ããããã«ã<a href="http://spark.apache.org">Apache Spark</a>ã»<a href="http://www.geomesa.org/">GeoMesa</a>ã³ãã¥ããã£ã¼ã¨ååãã¦ãã¦ã¨ã¦ãã¨ããµã¤ãã£ã³ã°ã§ãã</p> + +<p>ããããã®ãã©ãããã©ã¼ã ã§Arrowãä½¿ãæ¹æ³ã¯<a href="http://arrow.apache.org/install">ã¤ã³ã¹ãã¼ã«ãã¼ã¸</a>ãè¦ã¦ãã ããã</p> + +<p>Arrowã§ããã°ãã¼ã¿ã·ã¹ãã ãé«éåããã±ã¼ã¹ãå¢ããããã«ãè¿ããã¡ã«Apache Arrowã®ãã¼ãããããå ¬éããäºå®ã§ãã</p> + +<p>Arrowã®éçºã«åå ããã³ã³ããªãã¥ã¼ã¿ã¼ãåéãã¦ãã¾ãããã§ã«Arrowã®éçºã«åå ãã¦ããã³ãã¥ããã£ã¼ããã®ã³ã³ããªãã¥ã¼ã¿ã¼ãããã§ãããã¾ã åå ãã¦ããªãGoãRãJuliaã¨ãã£ãã³ãã¥ããã£ã¼ããã®ã³ã³ããªãã¥ã¼ã¿ã¼ãåéãã¦ãã¾ãã</p> + +<h3 id="ãã¡ã¤ã«ãã©ã¼ãããã¨ã¹ããªã¼ãã³ã°ãã©ã¼ãããã®å¼·å">ãã¡ã¤ã«ãã©ã¼ãããã¨ã¹ããªã¼ãã³ã°ãã©ã¼ãããã®å¼·å</h3> + +<p>0.2.0ã§ã¯<strong>ã©ã³ãã ã¢ã¯ã»ã¹</strong>ç¨ã¨<strong>ã¹ããªã¼ãã³ã°</strong>ç¨ã®Arrowã®ã¯ã¤ã¤ã¼ãã©ã¼ããããå°å ¥ãã¾ãããå®è£ ã®è©³ç´°ã¯<a href="http://arrow.apache.org/docs/ipc.html">IPC仿§</a>ãè¦ã¦ãã ãããã¦ã¼ã¹ã±ã¼ã¹ã¯<a href="http://wesmckinney.com/blog/arrow-streaming-columnar/">使ç¨ä¾ãç´¹ä»ããããã°</a>ãè¦ã¦ãã ããããããã®ãã©ã¼ãããã使ãã¨ä½ãªã¼ãã¼ãããã»ã³ãã¼ãªãã§Arrowã®ã¬ã³ã¼ããããã®ãã¤ãã¼ãã«ã¢ã¯ã»ã¹ã§ãã¾ãã</p> + +<p>0.3.0ã§ã¯ãã®ãã¤ããªã¼ãã©ãããã®ç´°ãã詳細ãããããåºãã¾ãããJavaãC++ãPythonéã®é£æºã®ãã¹ãããã³ããããè¨èªã§ã®åä½ãã¹ãã®æ´åãé²ãã¾ããã<a href="http://github.com/google/flatbuffers">Google Flatbuffers</a>ã¯ãåæ¹äºææ§ãå£ããã«ã¡ã¿ãã¼ã¿ã«æ°ããæ©è½ã追å ããã®ã«é常ã«å©ããã¾ããã</p> + +<p>ã¾ã ãã¤ããªã¼ãã©ã¼ãããã®åæ¹äºææ§ãå¿ ãå£ããªãã¨ç´æã§ããç¶æ ã§ã¯ããã¾ãããï¼ãããããã夿´ããå¿ è¦ããããªã«ããè¦ã¤ãããããããªãï¼ãã¡ã¸ã£ã¼ãªãªã¼ã¹éã§ã¯ä¸å¿ è¦ã«äºææ§ãå£ããªãããã«åªåããã¤ããã§ããApache Arrowã®Webãµã¤ããåã³ã³ãã¼ãã³ãã®ã¦ã¼ã¶ã¼åãã®ããã¥ã¡ã³ãããã³APIããã¥ã¡ã³ãã¸ã®ã³ã³ããªãã¥ã¼ã·ã§ã³ãéå¸¸ã«æè¿ãã¾ãã</p> + +<h3 id="è¾æ¸ã¨ã³ã³ã¼ãã£ã³ã°ã®ãµãã¼ã">è¾æ¸ã¨ã³ã³ã¼ãã£ã³ã°ã®ãµãã¼ã</h3> + +<p><a href="http://www.geomesa.org/">GeoMesa</a>ããã¸ã§ã¯ãã®<a href="https://github.com/elahrvivaz">Emilio Lahr-Vivaz</a>ã¯Javaã®Arrowå®è£ ã«è¾æ¸ã¨ã³ã³ã¼ã対å¿ãã¯ã¿ã¼ãã³ã³ããªãã¥ã¼ããã¾ããããããåãã¦ãC++ã¨Pythonã§ããµãã¼ããã¾ãããï¼<code class="highlighter-rouge">pandas.Categorical</code>ã¨ã飿ºã§ãã¾ããï¼è¾æ¸ã¨ã³ã³ã¼ãã£ã³ã°ç¨ã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ãï¼C++ã¨Javaéã§ãã®ãã¼ã¿ãéåä¿¡ãããã¹ãï¼ã¯ã¾ã 宿ãã¦ãã¾ãããã0.4.0ã¾ã§ã«ã¯å®æããããã§ãã</p> + +<p>ããã¯ã«ãã´ãªã¼ãã¼ã¿ç¨ã®ä¸è¬çãªãã¼ã¿è¡¨ç¾ãã¯ããã¯ã§ããããã使ãã¨ãè¤æ°ã®ã¬ã³ã¼ããããã§å ±éã®ãè¾æ¸ããå ±æããåã¬ã³ã¼ããããã®å¤ã¯ãã®è¾æ¸ãåç §ããæ´æ°ã«ãªãã¾ãããã®ãã¼ã¿ã¯çµ±è¨çè¨èªï¼statistical languageï¼ã®åéã§ã¯ãã«ãã´ãªã¼ï¼categoricalï¼ãããå åï¼factorï¼ãã¨å¼ã°ãã¦ãã¾ããApache Parquetã®ãããªãã¡ã¤ã«ãã©ã¼ãããã®åéã§ã¯ãã¼ã¿å§ç¸®ã®ããã ãã«ä½¿ããã¦ãã¾ãã</p> + +<h3 id="æ¥ä»æå»åºå®é·åã®æ¡å¼µ">æ¥ä»ãæå»ãåºå®é·åã®æ¡å¼µ</h3> + +<p>0.2.0ã§ã¯ç¾å®ã«ä½¿ããã¦ããæ¥ä»ã»æå»åãã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ãä»ãã§å®å ¨ã«ãµãã¼ããããã¨ã諦ãã¾ããããããã¯<a href="http://parquet.apache.org">Apache Parquet</a>ã¨Apache Sparkã¨ã®é£æºã«å¿ è¦ãªæ©è½ã§ãã</p> + +<ul> + <li><strong>æ¥ä»</strong>: 32-bitï¼æ¥åä½ï¼ã¨64-bitï¼ããªç§åä½ï¼</li> + <li><strong>æå»</strong>: åä½ä»ã64-bitæ´æ°ï¼åä½ï¼ç§ãããªç§ããã¤ã¯ãç§ãããç§ï¼</li> + <li><strong>ã¿ã¤ã ã¹ã¿ã³ãï¼UNIXã¨ããã¯ããã®çµéæéï¼</strong>: åä½ä»ã64-bitæ´æ°ã®ã¿ã¤ã ã¾ã¼ã³ä»ãã¨ã¿ã¤ã ã¾ã¼ã³ãªã</li> + <li><strong>åºå®é·ãã¤ããªã¼</strong>: 決ã¾ã£ããã¤ãæ°ã®ããªããã£ããªå¤</li> + <li><strong>åºå®é·ãªã¹ã</strong>: åè¦ç´ ãåããµã¤ãºã®ãªã¹ãï¼è¦ç´ ã®ãã¯ã¿ã¼ã¨ã¯å¥ã«ãªãã»ããã®ãã¯ã¿ã¼ãæã¤å¿ è¦ããªãï¼</li> +</ul> + +<p>C++ã®Arrowå®è£ ã§ã¯ã<a href="https://github.com/boostorg/multiprecision">Boost.Multiprecision</a>ã使ã£ãexactãªå°æ°ã®ãµãã¼ããå®é¨çã«è¿½å ãã¾ããããã ããJavaå®è£ ã¨C++å®è£ éã§ã®å°æ°ã®ã¡ã¢ãªã¼ãã©ã¼ãããã¯ã¾ã åºã¾ã£ã¦ãã¾ããã</p> + +<h3 id="cã¨pythonã®windowsãµãã¼ã">C++ã¨Pythonã®Windowsãµãã¼ã</h3> + +<p>ä¸è¬çãªC++ã¨Pythonã§ã®éçºç¨ã«ãããã±ã¼ã¸å¨ãã®æ¹è¯ã夿°å ¥ã£ã¦ãã¾ãã0.3.0ã¯Visual Studioï¼MSVCï¼2015ã¨2017ã使ã£ã¦Windowsãå®å ¨ã«ãµãã¼ãããæåã®ãã¼ã¸ã§ã³ã§ããAppveyorã§MSVCç¨ã®CIãå®è¡ãã¦ãã¾ããWindowsä¸ã§ã½ã¼ã¹ãããã«ãããããã®ã¬ã¤ããæ¸ãã¾ããã<a href="https://github.com/apache/arrow/blob/master/cpp/apidoc/Windows.md">C++</a>ç¨ã¨<a href="https://github.com/apache/arrow/blob/master/python/doc/source/development.rst">Python</a>ç¨ã</p> + +<p><a href="https://conda-forge.github.io">conda-forge</a>ããWindowsç¨ã®Arrowã®Pythonã©ã¤ãã©ãªã¼ãã¤ã³ã¹ãã¼ã«ã§ãã¾ãã</p> + +<div class="language-shell highlighter-rouge"><pre class="highlight"><code>conda install pyarrow -c conda-forge +</code></pre> +</div> + +<h3 id="cglibãã¤ã³ãã£ã³ã°ã¨rubyluaä»ã®ãµãã¼ã">Cï¼GLibï¼ãã¤ã³ãã£ã³ã°ã¨Rubyã»Luaã»ä»ã®ãµãã¼ã</h3> + +<p><a href="http://github.com/kou">Kouhei Sutou</a>ã¯æ°ããApache Arrowã®ã³ã³ããªãã¥ã¼ã¿ã¼ã§ããLinuxç¨ã®ï¼Arrowã®C++å®è£ ã®ï¼GLibã使ã£ãCãã¤ã³ãã£ã³ã°ãã³ã³ããªãã¥ã¼ããã¾ããã<a href="https://wiki.gnome.org/Projects/GObjectIntrospection">GObject Introspection</a>ã¨ããCã®ããã«ã¦ã§ã¢ã使ããã¨ã§RubyãLuaãGoã<a href="https://wiki.gnome.org/Projects/GObjectIntrospection/Users">ä»ã«ãæ§ã ãªããã°ã©ãã³ã°è¨èª</a>ã§ã·ã¼ã ã¬ã¹ã«ãã¤ã³ãã£ã³ã°ã使ããã¨ãã§ãã¾ãããããã®ãã¤ã³ãã£ã³ã°ãã©ã®ããã«åãã¦ãããããããã®ãã¤ã³ãã£ã³ã°ãã©ã®ããã«ä½¿ããã説æããããã°è¨äºãå¥éå¿ è¦ãªæ°ããã¾ãã</p> + +<h3 id="pysparkã使ã£ãapache-sparkã¨ã®é£æº">PySparkã使ã£ãApache Sparkã¨ã®é£æº</h3> + +<p><a href="https://issues.apache.org/jira/browse/SPARK-13534">SPARK-13534</a>ã§Apache Sparkã³ãã¥ããã£ã¼ã¨ååãã¦ãã¾ããPySparkã§ã®<code class="highlighter-rouge">DataFrame.toPandas</code>ãArrowã使ã£ã¦é«éåãããã¨ãã¦ãã¾ããå¹ççãªãã¼ã¿ã®ã·ãªã¢ã©ã¤ãºã«ãã<a href="https://github.com/apache/spark/pull/15821#issuecomment-282175163"><strong>40å以ä¸é«éå</strong></a>ã§ããã±ã¼ã¹ãããã¾ãã</p> + +<p>PySparkã§Arrowã使ããã¨ã§ããã¾ã§ã§ããªãã£ãããã©ã¼ãã³ã¹æé©åã®éãéãã¾ãããç¹ã«ãUDFã®è©ä¾¡ã¾ããã§ããããããããã¨ãããã§ããããï¼ãã¨ãã°ãPythonã®ã©ã ã颿°ã使ã£ã¦<code class="highlighter-rouge">map</code>ã»<code class="highlighter-rouge">filter</code>ãå®è¡ããã±ã¼ã¹ãï¼</p> + +<h3 id="pythonå®è£ ã§ã®æ°ããæ©è½ã¡ã¢ãªã¼ãã¥ã¼featherapache-parquetã®ãµãã¼ã">Pythonå®è£ ã§ã®æ°ããæ©è½ï¼ã¡ã¢ãªã¼ãã¥ã¼ãFeatherãApache Parquetã®ãµãã¼ã</h3> + +<p>Arrowã®Pythonã©ã¤ãã©ãªã¼ã§ãã<code class="highlighter-rouge">pyarrow</code>ã¯<code class="highlighter-rouge">libarrow</code>ã¨<code class="highlighter-rouge">libarrow_python</code>ã¨ããC++ã©ã¤ãã©ãªã¼ã®Cythonãã¤ã³ãã£ã³ã°ã§ãã<code class="highlighter-rouge">pyarrow</code>ã¯NumPyã¨<a href="http://pandas.pydata.org">pandas</a>ã¨Pythonã®æ¨æºã©ã¤ãã©ãªã¼éã®ã·ã¼ã ã¬ã¹ãªé£æºãå®ç¾ãã¾ãã</p> + +<p>Arrowã®C++ã©ã¤ãã©ãªã¼ã§æãéè¦ãªãã®ã¯<code class="highlighter-rouge">arrow::Buffer</code>ãªãã¸ã§ã¯ãã§ããããã¯ã¡ã¢ãªã¼ãã¥ã¼ã管çãã¾ããã³ãã¼ãªãã®èªã¿è¾¼ã¿ã¨ã¹ã©ã¤ã¹ããµãã¼ããã¦ããç¹ãéè¦ã§ãã<a href="https://github.com/JeffKnupp">Jeff Knupp</a>ã¯Arrowã®ãããã¡ã¼ã¨Pythonã®ãããã¡ã¼ãããã³ã«ã¨memoryviewã®é£æºå¦çãã³ã³ããªãã¥ã¼ããã¾ãããããã«ããæ¬¡ã®ãããªãã¨ãã§ããããã«ãªãã¾ããã</p> + +<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">In</span> <span class="p">[</span><span class="mi">6</span><span class="p">]:</span> <span class="kn">import</span> <span class="nn">pyarrow</span> <span class="kn">as</span> <span class="nn">pa</span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">7</span><span class="p">]:</span> <span class="n">buf</span> <span class="o">=</span> <span class="n">pa</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">b</span><span class="s">'foobarbaz'</span><span class="p">)</span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span class="n">buf</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span class="o"><</span><span class="n">pyarrow</span><span class="o">.</span><span class="n">_io</span><span class="o">.</span><span class="n">Buffer</span> <span class="n">at</span> <span class="mh">0x7f6c0a84b538</span><span class="o">></span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">9</span><span class="p">]:</span> <span class="n">memoryview</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">9</span><span class="p">]:</span> <span class="o"><</span><span class="n">memory</span> <span class="n">at</span> <span class="mh">0x7f6c0a8c5e88</span><span class="o">></span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">10</span><span class="p">]:</span> <span class="n">buf</span><span class="o">.</span><span class="n">to_pybytes</span><span class="p">()</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">10</span><span class="p">]:</span> <span class="n">b</span><span class="s">'foobarbaz'</span> +</code></pre> +</div> + +<p>C++ã§ã®Parquetå®è£ ã§ãã<a href="https://github.com/apache/parquet-cpp">parquet-cpp</a>ã使ããã¨ã§å¤§å¹ ã«<a href="http://parquet.apache.org"><strong>Apache Parquet</strong></a>ãµãã¼ããæ¹è¯ãã¾ããããã¨ãã°ããã£ã¹ã¯ä¸ã«ãããHDFSä¸ã«ãããé¢ä¿ãªãããã¼ãã£ã·ã§ã³ããããã¼ã¿ã»ããããµãã¼ããã¾ããã<a href="https://github.com/dask/dask/commit/68f9e417924a985c1f2e2a587126833c70a2e9f4">Daskããã¸ã§ã¯ã</a>ã¯Arrowã使ã£ãParquetãµãã¼ããå®è£ ããæåã®ããã¸ã§ã¯ãã§ããDaskéçºè ã¨ã¯pandsãã¼ã¿ã忣å¦çããæèã§ããã«ååã§ãããã¨ã楽ãã¿ã«ãã¦ãã¾ãã</p> + +<p>pandasãæçãããããã«Arrowãæ¹è¯ãããã¨ãããã<a href="https://github.com/wesm/feather"><strong>Featherãã©ã¼ããã</strong></a>ã®å®è£ ããã¼ã¸ããã®ããã®1ã¤ã§ããFeatherãã©ã¼ãããã¯æ¬è³ªçã«ã¯Arrowã®ã©ã³ãã ã¢ã¯ã»ã¹ãã©ã¼ãããã®ç¹å¥ãªã±ã¼ã¹ã®1ã¤ã§ããArrowã®ã³ã¼ããã¼ã¹ã§Featherã®éçºãç¶ãã¾ãããã¨ãã°ãä»ã®Featherã¯Arrowã®Pythonãã¤ã³ãã£ã³ã°ã®ã¬ã¤ã¤ã¼ã使ããã¨ã§Pythonã®ãã¡ã¤ã«ãªãã¸ã§ã¯ããèªã¿æ¸ãã§ããããã«ãªã£ã¦ãã¾ãã</p> + +<p><code class="highlighter-rouge">DatetimeTZ</code>ã<code class="highlighter-rouge">Categorical</code>ã¨ãã£ãpandasåºæã®ãã¼ã¿åã®ã¡ããã¨ããï¼robustï¼ãµãã¼ããå®è£ ãã¾ããã</p> + +<h3 id="cã©ã¤ãã©ãªã¼ã§ã®ãã³ã½ã«ãµãã¼ã">C++ã©ã¤ãã©ãªã¼ã§ã®ãã³ã½ã«ãµãã¼ã</h3> + +<p>Apache Arrowã¯ã³ãã¼ãªãã§å ±æã¡ã¢ãªã¼ã管çãããã¼ã«ã¨ããå´é¢ãããã¾ããæ©æ¢°å¦ç¿ã¢ããªã±ã¼ã·ã§ã³ã®æèã§ãã®æ©è½ã¸ã®é¢å¿ãå¢ãã¦ãã¾ããUCãã¼ã¯ã¬ã¼æ ¡ã®<a href="https://rise.cs.berkeley.edu/">RISELab</a>ã®<a href="https://github.com/ray-project/ray">Rayããã¸ã§ã¯ã</a>ãæåã®ä¾ã§ãã</p> + +<p>æ©æ¢°å¦ç¿ã§ã¯ã¯ããã³ã½ã«ãã¨ãå¼ã°ãã夿¬¡å é åã¨ãããã¼ã¿æ§é ãæ±ãã¾ãããã®ãããªãã¼ã¿æ§é ã¯Arrowã®ã«ã©ã ãã©ã¼ãããããµãã¼ããã¦ãããã¼ã¿æ§é ã®ç¯å²ãè¶ ãã¦ãã¾ããä»åã®ã±ã¼ã¹ã§ã¯ã<a href="http://arrow.apache.org/docs/cpp/classarrow_1_1_tensor.html"><code class="highlighter-rouge">arrow::Tensor</code></a>ã¨ããC++ã®åã追å ã§å®è£ ãã¾ãããããã¯Arrowã®ã³ãã¼ãªãã®å ±æã¡ã¢ãªã¼æ©è½ãæ´»ç¨ãã¦å®è£ ãã¾ãããï¼ã¡ã¢ãªã¼ã®çåæéã®ç®¡çã«<code class="highlighter-rouge">arrow::Buffer</code>ã使ãã¾ãããï¼C++å®è£ ã§ã¯ãããããããå ±éã®IOã»ã¡ã¢ãªã¼ç®¡çãã¼ã«ã¨ãã¦Arrowãæ´»ç¨ã§ããããã«ããããã追å ã®ãã¼ã¿æ§é ãæä¾ããã¤ããã§ãã</p> + +<h3 id="javascripttypescriptå®è£ ã®éå§">JavaScriptï¼TypeScriptï¼å®è£ ã®éå§</h3> + +<p><a href="https://github.com/TheNeuralBit">Brian Hulette</a>ã¯NodeJSã¨Webãã©ã¦ã¶ã¼ä¸ã§åãã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ãããã«<a href="https://github.com/apache/arrow/tree/master/js">TypeScript</a>ã§ã®Arrowã®å®è£ ãå§ãã¾ãããFlatBuffersãJavaScriptããã¡ã¼ã¹ãã¯ã©ã¹ã§ãµãã¼ããã¦ããã®ã§å®è£ ãæãã¾ãã</p> + +<h3 id="webãµã¤ãã¨éçºè ç¨ããã¥ã¡ã³ãã®æ¹è¯">Webãµã¤ãã¨éçºè ç¨ããã¥ã¡ã³ãã®æ¹è¯</h3> + +<p>0.2.0ããªãªã¼ã¹ãã¦ããããã¥ã¡ã³ãã¨ããã°ãå ¬éããããã«Webãµã¤ãã®ã·ã¹ãã ã<a href="https://jekyllrb.com">Jekyll</a>ãã¼ã¹ã§ä½ãã¾ãããKouhei Sutouã¯<a href="https://github.com/red-data-tools/jekyll-jupyter-notebook">Jekyll Jupyter Notebookãã©ã°ã¤ã³</a>ãä½ãã¾ãããããã«ããArrowã®Webãµã¤ãã®ã³ã³ãã³ããä½ãããã«Jupyterã使ããã¨ãã§ãã¾ãã</p> + +<p>Webãµã¤ãã«ã¯CãC++ãJavaãPythonã®APIããã¥ã¡ã³ããå ¬éãã¾ããããããã®ä¸ã«Arrowã使ãå§ããããã®æçãªæ å ±ãè¦ã¤ããããã§ãããã</p> + +<h3 id="ã³ã³ããªãã¥ã¼ã¿ã¼">ã³ã³ããªãã¥ã¼ã¿ã¼</h3> + +<p>ãã®ãªãªã¼ã¹ã«ããããã³ã³ããªãã¥ã¼ãããã¿ãªããã«æè¬ãã¾ãã</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>$ git shortlog -sn apache-arrow-0.2.0..apache-arrow-0.3.0 + 119 Wes McKinney + 55 Kouhei Sutou + 18 Uwe L. Korn + 17 Julien Le Dem + 9 Phillip Cloud + 6 Bryan Cutler + 5 Philipp Moritz + 5 Emilio Lahr-Vivaz + 4 Max Risuhin + 4 Johan Mabille + 4 Jeff Knupp + 3 Steven Phillips + 3 Miki Tebeka + 2 Leif Walsh + 2 Jeff Reback + 2 Brian Hulette + 1 Tsuyoshi Ozawa + 1 rvernica + 1 Nong Li + 1 Julien Lafaye + 1 Itai Incze + 1 Holden Karau + 1 Deepak Majeti +</code></pre> +</div> + + + + <hr/> +<footer class="footer"> + <p>Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p> + <p>© 2017 Apache Software Foundation</p> +</footer> + + </div> +</body> +</html> http://git-wip-us.apache.org/repos/asf/arrow-site/blob/3cd84682/build/blog/2017/05/07/0.3-release/index.html ---------------------------------------------------------------------- diff --git a/build/blog/2017/05/07/0.3-release/index.html b/build/blog/2017/05/07/0.3-release/index.html new file mode 100644 index 0000000..1b6e0f3 --- /dev/null +++ b/build/blog/2017/05/07/0.3-release/index.html @@ -0,0 +1,364 @@ +<!DOCTYPE html> +<html lang="en-US"> + <head> + <meta charset="UTF-8"> + <title>Apache Arrow Homepage</title> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="generator" content="Jekyll v3.4.3"> + <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> + <link rel="icon" type="image/x-icon" href="/favicon.ico"> + + <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900"> + + <link href="/css/main.css" rel="stylesheet"> + <link href="/css/syntax.css" rel="stylesheet"> + <script src="https://code.jquery.com/jquery-3.2.1.min.js" + integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" + crossorigin="anonymous"></script> + <script src="/assets/javascripts/bootstrap.min.js"></script> + + <!-- Global Site Tag (gtag.js) - Google Analytics --> +<script async src="https://www.googletagmanager.com/gtag/js?id=UA-107500873-1"></script> +<script> + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments)}; + gtag('js', new Date()); + + gtag('config', 'UA-107500873-1'); +</script> + + + </head> + + + +<body class="wrap"> + <div class="container"> + <nav class="navbar navbar-default"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#arrow-navbar"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/">Apache Arrow™ </a> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="arrow-navbar"> + <ul class="nav navbar-nav"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Project Links<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/install/">Install</a></li> + <li><a href="/blog/">Blog</a></li> + <li><a href="/release/">Releases</a></li> + <li><a href="https://issues.apache.org/jira/browse/ARROW">Issue Tracker</a></li> + <li><a href="https://github.com/apache/arrow">Source Code</a></li> + <li><a href="http://mail-archives.apache.org/mod_mbox/arrow-dev/">Mailing List</a></li> + <li><a href="https://apachearrowslackin.herokuapp.com">Slack Channel</a></li> + <li><a href="/committers/">Committers</a></li> + <li><a href="/powered_by/">Powered By</a></li> + </ul> + </li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Specification<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/docs/memory_layout.html">Memory Layout</a></li> + <li><a href="/docs/metadata.html">Metadata</a></li> + <li><a href="/docs/ipc.html">Messaging / IPC</a></li> + </ul> + </li> + + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">Documentation<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="/docs/python">Python</a></li> + <li><a href="/docs/cpp">C++ API</a></li> + <li><a href="/docs/java">Java API</a></li> + <li><a href="/docs/c_glib">C GLib API</a></li> + </ul> + </li> + <!-- <li><a href="/blog">Blog</a></li> --> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" + role="button" aria-haspopup="true" + aria-expanded="false">ASF Links<span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li><a href="http://www.apache.org/">ASF Website</a></li> + <li><a href="http://www.apache.org/licenses/">License</a></li> + <li><a href="http://www.apache.org/foundation/sponsorship.html">Donate</a></li> + <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li> + <li><a href="http://www.apache.org/security/">Security</a></li> + </ul> + </li> + </ul> + <a href="http://www.apache.org/"> + <img style="float:right;" src="/img/asf_logo.svg" width="120px"/> + </a> + </div><!-- /.navbar-collapse --> + </div> + </nav> + + + <h2> + Apache Arrow 0.3.0 Release + <a href="/blog/2017/05/07/0.3-release/" class="permalink" title="Permalink">â</a> + </h2> + + + + <div class="panel"> + <div class="panel-body"> + <div> + <span class="label label-default">Published</span> + <span class="published"> + <i class="fa fa-calendar"></i> + 07 May 2017 + </span> + </div> + <div> + <span class="label label-default">By</span> + <a href="http://wesmckinney.com"><i class="fa fa-user"></i> Wes McKinney (wesm)</a> + </div> + </div> + </div> + + <!-- + +--> + +<p>Translations: <a href="/blog/2017/05/07/0.3-release-japanese/">æ¥æ¬èª</a></p> + +<p>The Apache Arrow team is pleased to announce the 0.3.0 release of the +project. It is the product of an intense 10 weeks of development since the +0.2.0 release from this past February. It includes <a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20ARROW%20AND%20status%20in%20(Resolved%2C%20Closed)%20AND%20fixVersion%20%3D%200.3.0"><strong>306 resolved JIRAs</strong></a> +from <a href="https://github.com/apache/arrow/graphs/contributors"><strong>23 contributors</strong></a>.</p> + +<p>While we have added many new features to the different Arrow implementations, +one of the major development focuses in 2017 has been hardening the in-memory +format, type metadata, and messaging protocol to provide a <strong>stable, +production-ready foundation</strong> for big data applications. We are excited to be +collaborating with the <a href="http://spark.apache.org">Apache Spark</a> and <a href="http://www.geomesa.org/">GeoMesa</a> communities on +utilizing Arrow for high performance IO and in-memory data processing.</p> + +<p>See the <a href="http://arrow.apache.org/install">Install Page</a> to learn how to get the libraries for your platform.</p> + +<p>We will be publishing more information about the Apache Arrow roadmap as we +forge ahead with using Arrow to accelerate big data systems.</p> + +<p>We are looking for more contributors from within our existing communities and +from other communities (such as Go, R, or Julia) to get involved in Arrow +development.</p> + +<h3 id="file-and-streaming-format-hardening">File and Streaming Format Hardening</h3> + +<p>The 0.2.0 release brought with it the first iterations of the <strong>random access</strong> +and <strong>streaming</strong> Arrow wire formats. See the <a href="http://arrow.apache.org/docs/ipc.html">IPC specification</a> for +implementation details and <a href="http://wesmckinney.com/blog/arrow-streaming-columnar/">example blog post</a> with some use cases. These +provide low-overhead, zero-copy access to Arrow record batch payloads.</p> + +<p>In 0.3.0 we have solidified a number of small details with the binary format +and improved our integration and unit testing particularly in the Java, C++, +and Python libraries. Using the <a href="http://github.com/google/flatbuffers">Google Flatbuffers</a> project has helped with +adding new features to our metadata without breaking forward compatibility.</p> + +<p>We are not yet ready to make a firm commitment to strong forward compatibility +(in case we find something needs to change) in the binary format, but we will +make efforts between major releases to not make unnecessary +breakages. Contributions to the website and component user and API +documentation would also be most welcome.</p> + +<h3 id="dictionary-encoding-support">Dictionary Encoding Support</h3> + +<p><a href="https://github.com/elahrvivaz">Emilio Lahr-Vivaz</a> from the <a href="http://www.geomesa.org/">GeoMesa</a> project contributed Java support +for dictionary-encoded Arrow vectors. We followed up with C++ and Python +support (and <code class="highlighter-rouge">pandas.Categorical</code> integration). We have not yet implemented +full integration tests for dictionaries (for sending this data between C++ and +Java), but hope to achieve this in the 0.4.0 Arrow release.</p> + +<p>This common data representation technique for categorical data allows multiple +record batches to share a common âdictionaryâ, with the values in the batches +being represented as integers referencing the dictionary. This data is called +âcategoricalâ or âfactorâ in statistical languages, while in file formats like +Apache Parquet it is strictly used for data compression.</p> + +<h3 id="expanded-date-time-and-fixed-size-types">Expanded Date, Time, and Fixed Size Types</h3> + +<p>A notable omission from the 0.2.0 release was complete and integration-tested +support for the gamut of date and time types that occur in the wild. These are +needed for <a href="http://parquet.apache.org">Apache Parquet</a> and Apache Spark integration.</p> + +<ul> + <li><strong>Date</strong>: 32-bit (days unit) and 64-bit (milliseconds unit)</li> + <li><strong>Time</strong>: 64-bit integer with unit (second, millisecond, microsecond, nanosecond)</li> + <li><strong>Timestamp</strong>: 64-bit integer with unit, with or without timezone</li> + <li><strong>Fixed Size Binary</strong>: Primitive values occupying certain number of bytes</li> + <li><strong>Fixed Size List</strong>: List values with constant size (no separate offsets vector)</li> +</ul> + +<p>We have additionally added experimental support for exact decimals in C++ using +<a href="https://github.com/boostorg/multiprecision">Boost.Multiprecision</a>, though we have not yet hardened the Decimal memory +format between the Java and C++ implementations.</p> + +<h3 id="c-and-python-support-on-windows">C++ and Python Support on Windows</h3> + +<p>We have made many general improvements to development and packaging for general +C++ and Python development. 0.3.0 is the first release to bring full C++ and +Python support for Windows on Visual Studio (MSVC) 2015 and 2017. In addition +to adding Appveyor continuous integration for MSVC, we have also written guides +for building from source on Windows: <a href="https://github.com/apache/arrow/blob/master/cpp/apidoc/Windows.md">C++</a> and <a href="https://github.com/apache/arrow/blob/master/python/doc/source/development.rst">Python</a>.</p> + +<p>For the first time, you can install the Arrow Python library on Windows from +<a href="https://conda-forge.github.io">conda-forge</a>:</p> + +<div class="language-shell highlighter-rouge"><pre class="highlight"><code>conda install pyarrow -c conda-forge +</code></pre> +</div> + +<h3 id="c-glib-bindings-with-support-for-ruby-lua-and-more">C (GLib) Bindings, with support for Ruby, Lua, and more</h3> + +<p><a href="http://github.com/kou">Kouhei Sutou</a> is a new Apache Arrow contributor and has contributed GLib C +bindings (to the C++ libraries) for Linux. Using a C middleware framework +called <a href="https://wiki.gnome.org/Projects/GObjectIntrospection">GObject Introspection</a>, it is possible to use these bindings +seamlessly in Ruby, Lua, Go, and <a href="https://wiki.gnome.org/Projects/GObjectIntrospection/Users">other programming languages</a>. We will +probably need to publish some follow up blogs explaining how these bindings +work and how to use them.</p> + +<h3 id="apache-spark-integration-for-pyspark">Apache Spark Integration for PySpark</h3> + +<p>We have been collaborating with the Apache Spark community on <a href="https://issues.apache.org/jira/browse/SPARK-13534">SPARK-13534</a> +to add support for using Arrow to accelerate <code class="highlighter-rouge">DataFrame.toPandas</code> in +PySpark. We have observed over <a href="https://github.com/apache/spark/pull/15821#issuecomment-282175163"><strong>40x speedup</strong></a> from the more efficient +data serialization.</p> + +<p>Using Arrow in PySpark opens the door to many other performance optimizations, +particularly around UDF evaluation (e.g. <code class="highlighter-rouge">map</code> and <code class="highlighter-rouge">filter</code> operations with +Python lambda functions).</p> + +<h3 id="new-python-feature-memory-views-feather-apache-parquet-support">New Python Feature: Memory Views, Feather, Apache Parquet support</h3> + +<p>Arrowâs Python library <code class="highlighter-rouge">pyarrow</code> is a Cython binding for the <code class="highlighter-rouge">libarrow</code> and +<code class="highlighter-rouge">libarrow_python</code> C++ libraries, which handle inteoperability with NumPy, +<a href="http://pandas.pydata.org">pandas</a>, and the Python standard library.</p> + +<p>At the heart of Arrowâs C++ libraries is the <code class="highlighter-rouge">arrow::Buffer</code> object, which is a +managed memory view supporting zero-copy reads and slices. <a href="https://github.com/JeffKnupp">Jeff Knupp</a> +contributed integration between Arrow buffers and the Python buffer protocol +and memoryviews, so now code like this is possible:</p> + +<div class="language-python highlighter-rouge"><pre class="highlight"><code><span class="n">In</span> <span class="p">[</span><span class="mi">6</span><span class="p">]:</span> <span class="kn">import</span> <span class="nn">pyarrow</span> <span class="kn">as</span> <span class="nn">pa</span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">7</span><span class="p">]:</span> <span class="n">buf</span> <span class="o">=</span> <span class="n">pa</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">b</span><span class="s">'foobarbaz'</span><span class="p">)</span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span class="n">buf</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span class="o"><</span><span class="n">pyarrow</span><span class="o">.</span><span class="n">_io</span><span class="o">.</span><span class="n">Buffer</span> <span class="n">at</span> <span class="mh">0x7f6c0a84b538</span><span class="o">></span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">9</span><span class="p">]:</span> <span class="n">memoryview</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">9</span><span class="p">]:</span> <span class="o"><</span><span class="n">memory</span> <span class="n">at</span> <span class="mh">0x7f6c0a8c5e88</span><span class="o">></span> + +<span class="n">In</span> <span class="p">[</span><span class="mi">10</span><span class="p">]:</span> <span class="n">buf</span><span class="o">.</span><span class="n">to_pybytes</span><span class="p">()</span> +<span class="n">Out</span><span class="p">[</span><span class="mi">10</span><span class="p">]:</span> <span class="n">b</span><span class="s">'foobarbaz'</span> +</code></pre> +</div> + +<p>We have significantly expanded <a href="http://parquet.apache.org"><strong>Apache Parquet</strong></a> support via the C++ +Parquet implementation <a href="https://github.com/apache/parquet-cpp">parquet-cpp</a>. This includes support for partitioned +datasets on disk or in HDFS. We added initial Arrow-powered Parquet support <a href="https://github.com/dask/dask/commit/68f9e417924a985c1f2e2a587126833c70a2e9f4">in +the Dask project</a>, and look forward to more collaborations with the Dask +developers on distributed processing of pandas data.</p> + +<p>With Arrowâs support for pandas maturing, we were able to merge in the +<a href="https://github.com/wesm/feather"><strong>Feather format</strong></a> implementation, which is essentially a special case of +the Arrow random access format. Weâll be continuing Feather development within +the Arrow codebase. For example, Feather can now read and write with Python +file objects using Arrowâs Python binding layer.</p> + +<p>We also implemented more robust support for pandas-specific data types, like +<code class="highlighter-rouge">DatetimeTZ</code> and <code class="highlighter-rouge">Categorical</code>.</p> + +<h3 id="support-for-tensors-and-beyond-in-c-library">Support for Tensors and beyond in C++ Library</h3> + +<p>There has been increased interest in using Apache Arrow as a tool for zero-copy +shared memory management for machine learning applications. A flagship example +is the <a href="https://github.com/ray-project/ray">Ray project</a> from the UC Berkeley <a href="https://rise.cs.berkeley.edu/">RISELab</a>.</p> + +<p>Machine learning deals in additional kinds of data structures beyond what the +Arrow columnar format supports, like multidimensional arrays aka âtensorsâ. As +such, we implemented the <a href="http://arrow.apache.org/docs/cpp/classarrow_1_1_tensor.html"><code class="highlighter-rouge">arrow::Tensor</code></a> C++ type which can utilize the +rest of Arrowâs zero-copy shared memory machinery (using <code class="highlighter-rouge">arrow::Buffer</code> for +managing memory lifetime). In C++ in particular, we will want to provide for +additional data structures utilizing common IO and memory management tools.</p> + +<h3 id="start-of-javascript-typescript-implementation">Start of JavaScript (TypeScript) Implementation</h3> + +<p><a href="https://github.com/TheNeuralBit">Brian Hulette</a> started developing an Arrow implementation in +<a href="https://github.com/apache/arrow/tree/master/js">TypeScript</a> for use in NodeJS and browser-side applications. We are +benefitting from Flatbuffersâ first class support for JavaScript.</p> + +<h3 id="improved-website-and-developer-documentation">Improved Website and Developer Documentation</h3> + +<p>Since 0.2.0 we have implemented a new website stack for publishing +documentation and blogs based on <a href="https://jekyllrb.com">Jekyll</a>. Kouhei Sutou developed a <a href="https://github.com/red-data-tools/jekyll-jupyter-notebook">Jekyll +Jupyter Notebook plugin</a> so that we can use Jupyter to author content for +the Arrow website.</p> + +<p>On the website, we have now published API documentation for the C, C++, Java, +and Python subcomponents. Within these you will find easier-to-follow developer +instructions for getting started.</p> + +<h3 id="contributors">Contributors</h3> + +<p>Thanks to all who contributed patches to this release.</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>$ git shortlog -sn apache-arrow-0.2.0..apache-arrow-0.3.0 + 119 Wes McKinney + 55 Kouhei Sutou + 18 Uwe L. Korn + 17 Julien Le Dem + 9 Phillip Cloud + 6 Bryan Cutler + 5 Philipp Moritz + 5 Emilio Lahr-Vivaz + 4 Max Risuhin + 4 Johan Mabille + 4 Jeff Knupp + 3 Steven Phillips + 3 Miki Tebeka + 2 Leif Walsh + 2 Jeff Reback + 2 Brian Hulette + 1 Tsuyoshi Ozawa + 1 rvernica + 1 Nong Li + 1 Julien Lafaye + 1 Itai Incze + 1 Holden Karau + 1 Deepak Majeti +</code></pre> +</div> + + + + <hr/> +<footer class="footer"> + <p>Apache Arrow, Arrow, Apache, the Apache feather logo, and the Apache Arrow project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p> + <p>© 2017 Apache Software Foundation</p> +</footer> + + </div> +</body> +</html>
